| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 802 人关注过本帖, 1 人收藏
标题:有关二叉树的层序遍历这块有问题,大家帮忙看看
只看楼主 加入收藏
yfnick
Rank: 2
等 级:论坛游民
帖 子:9
专家分:20
注 册:2009-10-15
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:4 
有关二叉树的层序遍历这块有问题,大家帮忙看看
之前层序遍历这块还可以正确输出,只是说会弹出调试窗口。修改之后越来越乱,索性连正确结果都没有了,我想应该是指针出问题了,大家帮帮忙
程序代码:
#include <iostream>

using namespace std;

struct node
{
    node * lchild;
    node * rchild;
    char data;
};
typedef node * BTREE;
typedef int datatype;

typedef struct queue
{
    BTREE bt;
    struct queue * next;
}QUEUE;

struct LinkQueue
{
    QUEUE *front;
    QUEUE *rear;
};

BTREE CreateTree(BTREE bt);
bool IsEmpty(BTREE bt);
void VisitData(BTREE bt);
void PreOrder(BTREE bt);
void InOrder(BTREE bt);
void PostOrder(BTREE bt);
void LayerOrder(BTREE bt);

void InitialQueue(LinkQueue *lq);
BTREE FrontQueue(LinkQueue *lq);
void EnQueue(LinkQueue *lq, BTREE bt);
void DelQueue(LinkQueue *lq);
void LayerOrder(LinkQueue *lq, BTREE bt);
bool QueueEmpty(LinkQueue *lq);
void DeleteQueue(LinkQueue *lq);

int main()
{
    BTREE bt = NULL;
    bt = CreateTree(bt);

    cout<<"pre order:"<<endl;
    PreOrder(bt);
    cout<<"\nIn order:"<<endl;
    InOrder(bt);
    cout<<"\nPost order:"<<endl;
    PostOrder(bt);
    cout<<"\nLayer order:"<<endl;
    LayerOrder(bt);

    return 0;
}

//函数功能:建立一个树
BTREE CreateTree(BTREE bt)
{
    char ch;
    cout<<"data:";
    cin>>ch;

    if(ch != '#')
    {
        bt = new node;
        bt->data = ch;
        bt->lchild = CreateTree(bt->lchild);
        bt->rchild = CreateTree(bt->rchild);
    }
    else
    {
        bt = NULL;
    }

    return bt;
}

//判断树是否为空
bool IsEmpty(BTREE bt)
{
    if(bt != NULL)
    {
        return false;
    }
    else
    {
        return true;
    }
}

//访问数节点信息
void VisitData(BTREE bt)
{
    if(bt != NULL)
    {
        cout<<(bt->data)<<" ";
    }
}

//对树进行先序遍历
void PreOrder(BTREE bt)
{
    if(!IsEmpty(bt))
    {
        VisitData(bt);
        PreOrder(bt->lchild);
        PreOrder(bt->rchild);
    }
}

//对树进行中序遍历
void InOrder(BTREE bt)
{
    if(!IsEmpty(bt))
    {
        InOrder(bt->lchild);
        VisitData(bt);
        InOrder(bt->rchild);
    }
}

//对树进行后序遍历
void PostOrder(BTREE bt)
{
    if(!IsEmpty(bt))
    {
        PostOrder(bt->lchild);
        PostOrder(bt->rchild);
        VisitData(bt);
    }
}

//初始化队列
void InitialQueue(LinkQueue *lq)
{
    lq->front = new QUEUE;
    lq->front->bt = NULL;
    lq->front->next = NULL;
    lq->rear = lq->front;
}

//队列的第一个
BTREE FrontQueue(LinkQueue *lq)
{
    if(lq->front != NULL)
    {
        return lq->front->bt;
    }
    return NULL;
}

//将元素加入到队列尾部
void EnQueue(LinkQueue *lq, BTREE bt)
{
    if(lq->front == NULL)
    {
        lq->rear->next = new QUEUE;
        lq->rear = lq->rear->next;
        lq->rear->bt = bt;
        lq->rear->next = NULL;
    }
    else
    {
        lq->front = new QUEUE;
        lq->front->bt = bt;
        lq->front->next = NULL;
        lq->rear = lq->front;
    }
}

//将队列最前面的元素从队列中删除
void DelQueue(LinkQueue *lq)
{
    if(lq->front != NULL)
    {
        if(lq->front->next != NULL)
        {
            lq->front = lq->front->next;
        }
        else
        {
            lq->front = NULL;
            lq->rear = NULL;
        }
    }
}

//对树进行层序遍历
void LayerOrder(BTREE bt)
{
    LinkQueue *lq = new LinkQueue;
    BTREE tmp = new node;
    InitialQueue(lq);

    if(bt == NULL)
        return;

    VisitData(bt);
    if(bt->lchild != NULL)
    {
        EnQueue(lq, bt->lchild);
    }
    if(bt->rchild != NULL)
    {
        EnQueue(lq, bt->rchild);
    }

    while(!QueueEmpty(lq))
    {
        DelQueue(lq);
        tmp = FrontQueue(lq);
        VisitData(tmp);

        if(tmp->lchild != NULL)
        {
            EnQueue(lq, tmp->lchild);
        }
        if(tmp->rchild != NULL)
        {
            EnQueue(lq, tmp->rchild);
        }
    }

    DeleteQueue(lq);
}

bool QueueEmpty(LinkQueue *lq)
{
    if(lq->front == NULL)
        return true;
    else
        return false;
}

void DeleteQueue(LinkQueue *lq)
{
    QUEUE *pr = lq->front, *tmp = NULL;
    while(pr != NULL)
    {
        tmp = pr;
        pr = pr->next;
        delete tmp;
    }
}

搜索更多相关主题的帖子: 遍历 二叉树 
2010-10-23 22:23
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:20 
//初始化队列
void InitialQueue(LinkQueue *lq)
{
    lq->rear = lq->front = NULL;
}

//队列的第一个
BTREE FrontQueue(LinkQueue *lq)
{
    if(lq->front != NULL)
    {
        return lq->front->bt;
    }
    return NULL;
}

//将元素加入到队列尾部
void EnQueue(LinkQueue *lq, BTREE bt)
{
    if(bt)
    {
        if( lq->front == NULL )
        {
            lq->front = new QUEUE;
            lq->front->bt = bt;
            lq->front->next = NULL;
            lq->rear = lq->front;
        }
        else
        {
            lq->rear->next = new QUEUE;
            lq->rear = lq->rear->next;
            lq->rear->bt = bt;
            lq->rear->next = NULL;
        }
    }
}

//将队列最前面的元素从队列中删除
void DelQueue(LinkQueue *lq)
{
    QUEUE *temp;
    if(lq->front != NULL)
    {
        temp = lq->front;
        lq->front = lq->front->next;
        delete temp;
    }
}

//对树进行层序遍历
void LayerOrder(BTREE bt)
{
    LinkQueue *lq = new LinkQueue;
    InitialQueue(lq);

    BTREE tmp = new node;
   
    EnQueue(lq, bt);
    while(!QueueEmpty(lq))
    {
        tmp = FrontQueue(lq);
        VisitData(tmp);

        EnQueue(lq, tmp->lchild);
        EnQueue(lq, tmp->rchild);

        DelQueue(lq);
    }
    DeleteQueue(lq);
}
2010-10-24 08:30
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
2010-10-24 08:31
yfnick
Rank: 2
等 级:论坛游民
帖 子:9
专家分:20
注 册:2009-10-15
收藏
得分:0 
回复 楼主 yfnick
非常感谢你啊,本来发这个贴没指望有多少人回的,没想到回帖速度这么快!!!
看来我还得继续努力啊
2010-10-24 09:30
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
呵呵 想回帖的人还是有很多的
只不过 我copy paste快啦点
2010-10-24 11:57
快速回复:有关二叉树的层序遍历这块有问题,大家帮忙看看
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022480 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved