帅过吴彦祖 2017-07-15 10:09 采纳率: 0%
浏览 908
已结题

求助!!层次遍历二叉树代码出问题了

include

include

//二叉树结点类型定义
typedef struct btNode
{
char data;
struct btNode * lchild;
struct btNode * rchild;
}BiTree,*Tree;

//队列结点类型定义
typedef struct Node
{
Tree data;
struct Node * next;
}Node,*pNode;

typedef struct Queue
{
pNode front;
pNode rear;
}QUEUE;
/*==========队列函数定义==========*/
void InitQueue(QUEUE &);
void EnQueue(QUEUE &, Tree);
void DeQueue(QUEUE &);
bool EmptyQueue(QUEUE);
void GetHead(QUEUE, Tree&);
/*==========队列函数定义==========*/

/*==========二叉树函数定义==========*/
void CreateTree(Tree &);
void Visit(Tree);
int Height(Tree);
void LevelOrder(Tree);
/*==========二叉树函数定义==========*/

int main(void)
{
Tree T;
printf("\n按先序序列输入结点序列,'#'代表空:");
CreateTree(T);

printf("二叉树的高度为%d\n",Height(T));
printf("二叉树的层次遍历结果为:");
LevelOrder(T);
printf("\n");

return 0;

}

void init(QUEUE & Q)
{
Q.front = (pNode)malloc(sizeof(Node));
if(NULL == Q.front)
{
printf("动态分配内存失败\n");
exit(-1);
}
Q.rear = Q.front;
}

//入队
void EnQueue(QUEUE & Q, Tree e)
{
pNode pNew = (pNode)malloc(sizeof(Node));
if(NULL == pNew)
{
printf("动态分配内存失败\n");
exit(-1);
}
pNew->data = e;
pNew->next = NULL;
Q.rear->next = pNew;
Q.rear = pNew;
}

//出队
void DeQueue(QUEUE & Q)
{
if(Q.front == Q.rear)
return;
else
{
pNode p = Q.front->next;
Q.front = p->next;
if(Q.rear == p)
Q.rear = Q.front;
free(p);
}
}

//判断队列是否为空
bool EmptyQueue(QUEUE Q)
{
if(Q.rear == Q.front)
return true;
else
return false;
}

//获得对首元素
void GetHead(QUEUE Q, Tree & e)
{
if(EmptyQueue(Q))
{
return;
}
else
{
e = Q.front->next->data;
}
}

//创建二叉树
void CreateTree(Tree &T)
{
char ch;
scanf("%c", &ch);
if('#' == ch)
T = NULL;
else
{
T = (Tree)malloc(sizeof(BiTree));
if(NULL == T)
{
printf("动态分配内存失败");
exit(-1);
}
else
{
T->data = ch;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
}

//访问节点
void Visit(Tree T)
{
printf("%c", T->data);
}

//求树的高度
int Height(Tree T)
{
int ld = 0;
int rd = 0;
if(NULL == T)
return 0;
else
{
ld = Height(T->lchild);
rd = Height(T->rchild);
return 1 + (ld>rd?ld:rd);
}
}

//层次遍历
void LevelOrder(Tree T)
{
QUEUE Q;
init(Q);
Tree p;

if(NULL != T)
{
    EnQueue(Q, T);
    while(!EmptyQueue(Q))
    {
        GetHead(Q, p);
        DeQueue(Q);
        Visit(p);
        if(NULL != p->lchild)
        EnQueue(Q, p->lchild);
        if(NULL != p->rchild)
        EnQueue(Q, p->rchild);
    }
}

}

输入A##正确,输入AB##C##出问题了

  • 写回答

1条回答 默认 最新

  • devmiao 2017-07-16 02:29
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度