| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 895 人关注过本帖
标题:”二叉树队列实现层次遍历“-----编译没有错误,但是结果却一直循环,求高手 ...
只看楼主 加入收藏
紫色棒棒糖
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-11-16
结帖率:0
收藏
已结贴  问题点数:5 回复次数:9 
”二叉树队列实现层次遍历“-----编译没有错误,但是结果却一直循环,求高手帮忙
#include<stdio.h>
#include<stdlib.h>
#define MaxSize  100

typedef struct BiTNode{
    int data;
    struct BiTNode *lchild,*rchild;
}BiTNode;

typedef struct Queue{
     int data[MaxSize];
     int front,rear;
 }Queue;
 
 Queue Q;
 
 //初始化队列
 int initQueue(Queue &Q)
 {
     Q.rear=Q.front=0;
     return 1;
 }
 //入队列
 int EnQueue(Queue &Q,  int x)
 {
     if((Q.rear+1)%MaxSize==Q.front)
     return 0;
     else
     {
         Q.rear=(Q.rear+1)%MaxSize;
        Q.data[Q.rear]=x;
        return 1;
     }
 }
 //出队列
 int DeQueue(Queue &Q,int &x)
 {
     if(Q.rear==Q.front)
        return 0;
     else
    {
        Q.front=(Q.front+1)%MaxSize;
        x=Q.data[Q.front];
        return 1;
    }
 }
 //判断对空
 int QueueEmpty(Queue Q)
 {
     if(Q.rear==Q.front)
        return 1;
    else
        return 0;
 }


//创建二叉树
BiTNode *createBiTree()
{
    BiTNode *T;
    int x;
    printf("请输入一个字符(输入为0时结束):");
    scanf("%d",&x);
    //ch = getchar();
    if(x==0) return(NULL);
    else
    //while(ch!='#')
    {
        T=(BiTNode*)malloc(sizeof(BiTNode));
        T->data=x;
        //printf("请输入一个数(输入为#时结束):\n");
        //scanf("%c",&ch);
        T->lchild=createBiTree();
        T->rchild=createBiTree();
        return T;
    }   
}
//层次遍历二叉树,队列实现之
void layerorder(BiTNode *T)
{
    initQueue(Q);
    if(T!=NULL) EnQueue(Q,T->data);
    BiTNode *p;
    p=T;
   
    while(!QueueEmpty(Q))
    {
        DeQueue(Q,p->data);
        printf("%d,",p->data);
        if(p->lchild!=NULL) EnQueue(Q,p->lchild->data);
        if(p->rchild!=NULL) EnQueue(Q,p->rchild->data);
    }
}
void main()
{
    BiTNode *root;
    root=createBiTree();
    layerorder(root);
}
搜索更多相关主题的帖子: include return 二叉树 
2011-11-21 22:35
cosam
Rank: 4
等 级:业余侠客
帖 子:146
专家分:259
注 册:2011-8-25
收藏
得分:1 
试一下单步调试,很快找出问题所在;


2011-11-22 09:37
i513536373
Rank: 1
等 级:新手上路
帖 子:3
专家分:1
注 册:2011-11-22
收藏
得分:1 
二叉树,其实我脑壳也大。。。反正我是没搞懂。。。
2011-11-22 11:15
紫色棒棒糖
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-11-16
收藏
得分:0 
我不会单步调试呢
2011-11-22 22:36
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:1 

我们都在路上。。。。。
2011-11-23 12:12
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:1 
单步调试是编程的基本功呀,我文盲,没上过大学,你们专业课程的教学可是从来不教的?

授人以渔,不授人以鱼。
2011-11-23 12:33
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:1 
void layerorder(BiTNode *T)
{
    initQueue(Q);
    if(T!=NULL) EnQueue(Q,T->data);
    BiTNode *p;
    p=T;
   
    while(!QueueEmpty(Q))
    {
        DeQueue(Q,p->data);
        printf("%d,",p->data);
        if(p->lchild!=NULL) EnQueue(Q,p->lchild->data);
        if(p->rchild!=NULL) EnQueue(Q,p->rchild->data);
    }
}

p的值永远没改变,所以p->lchild!=NULL永远成立,就意味着一直会有值插入对列中,程序当然停不下来

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-11-23 17:33
紫色棒棒糖
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-11-16
收藏
得分:0 
回复 4楼 紫色棒棒糖
谢谢了,我会好好看看的
2011-11-30 14:34
紫色棒棒糖
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2011-11-16
收藏
得分:0 
回复 6楼 TonyDeng
哦,入队列的应该是整个结点,而不是data域
2011-11-30 14:35
浅暗花璃
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2016-3-31
收藏
得分:0 
怎么将节点入队列呢,我也碰到这个问题了,怎么将p的值改变呢
2016-10-28 13:29
快速回复:”二叉树队列实现层次遍历“-----编译没有错误,但是结果却一直循环, ...
数据加载中...
 
   



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

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