关于二叉树的建立和遍历 ,为什么输入之后不输出啊

作者&投稿:赞枯 (若有异议请与网页底部的电邮联系)
二叉树建立和中序遍历时候,输入字符,但是没有任何输出~

经测试有正确的输出,但看到有几处bug
void InOrder(BiTree T)
{
if(T != NULL)
{

PreOrder(T->lchild); //复制粘贴bug
coutdata<<" ";
PreOrder(T->rchild); //复制粘贴bug
}
}

void PostOrder(BiTree T)
{
if(T != NULL)
{

PreOrder(T->lchild); //复制粘贴bug
PreOrder(T->rchild); //复制粘贴bug
coutdata<<" ";
}
}

#include #include #define M 10typedef struct bnode{char data;struct bnode *lchild;struct bnode *rchild;}Bnode, *BTree;/*建立二叉树*/ void creat_BTree(BTree* T){char n;n=getchar();if(n=='#')*T=NULL;else if(n=='
') return; else {(*T)=(BTree)malloc(sizeof(Bnode));(*T)->data=n;creat_BTree(&(*T)->lchild);creat_BTree(&(*T)->rchild);}}/*前序遍历*/ void r_preorder(BTree T){if(T){ printf("%c",T->data);r_preorder(T->lchild);r_preorder(T->rchild);}}/*后序遍历*/ void r_posorder(BTree T){if(T){r_posorder(T->lchild);r_posorder(T->rchild);printf("%c",T->data);}}/*层次遍历*/void r_levelorder(BTree T){ BTree q[1024]; BTree p; int front=0,rear=0; if(T) { q[rear]=T; rear=(rear+1)%M; } while(front!=rear) { p=q[front]; printf("%c ",p->data); if(p->lchild) { q[rear]=p->lchild; rear=(rear+1)%M; } if(p->rchild) { q[rear]=p->rchild; rear=(rear+1)%M; } front = (front+1)%M; }}int main(){BTree T;T=NULL; int select;while(1){printf("
请选择要进行的操作:
");printf(" 1 创建二叉树
");printf(" 2 前序遍历
");printf(" 3 后序遍历
");printf(" 4 层次遍历
");printf(" 5 结束程序
");printf("=========================
");scanf("%d",&select); getchar();switch (select){case 1:{printf("请按前序次序输入各结点的值,以#表示空树(输入时可连续输入)
");creat_BTree(&T);break;}case 2:{if(!T) printf("未建树,请先执行1操作建树!
");else r_preorder(T);break;}case 3:{if(!T) printf("未建树,请先执行1操作建树!
");else r_posorder(T);break;}case 4:{if(!T) printf("未建树,请先执行1操作建树!
");else r_levelorder(T);break;}default:; } }}

有两个错误:1.当读入的是空格时,T赋值为空不错,但此时应该返回,而不应该进入下一个判断的else分句,楼主的代码就是进入了if(ch=='#') exit(0);的else分句。2.可以看到主函数中对createbitree的调用需要用一个指针承接返回值,所以根据递归调用的形式不变,在createbitree中调用自身的时候也要承接返回值。根据楼主的代码修改如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
BiTree creatbitree(BiTree t) //先序建立二叉树
{
BiTree T=t;
char ch;

ch=getchar();
if(ch==' ')
T=NULL;
else {
if(ch=='#')
exit(0);
else{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild = creatbitree(T->lchild);
T->rchild = creatbitree(T->rchild);
}
}

return T;
}
void BiTreeTra(BiTree t) //先序遍历二叉树
{
if(t)
{
printf("%c",t->data);
BiTreeTra(t->lchild);
BiTreeTra(t->rchild);
}
}
void main()
{
BiTree tree;
BiTree T=NULL;
tree=creatbitree(T);
BiTreeTra(tree);
}

飘过。。。

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void creatbitree(BiTree &T) //先序建立二叉树
{
char ch;
ch=getchar();
if(ch==' ') T=NULL;
else{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
creatbitree(T->lchild);
creatbitree(T->rchild);
}
}
void BiTreeTra(BiTree t) //先序遍历二叉树
{
if(t)
{
printf("%c",t->data);
BiTreeTra(t->lchild);
BiTreeTra(t->rchild);
}
}
void main()
{
BiTree tree=NULL;
creatbitree(tree);
BiTreeTra(tree);
}
//放在.cpp文件下,就可以运行