C语言二叉树的遍历问题,照着他人的代码练习的,实在是自己找不出错误的地方了,明白的还望帮忙看下 谢谢
#include<stdio.h>#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#define Max 20 //节点最大数
typedef char DataType;
typedef struct BitNode //二叉树结构体
{
DataType data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
typedef struct stackelem //栈的结构体
{
BitNode *a[Max];
int top;
}Stack;
void BinTreeCreat(BitNode *BT) //利用递归的方式创建二叉树
{
char ch;
scanf("%c",&ch);
while(ch!='#')
{
BitNode *BT=(BitNode *)malloc(sizeof(BitNode));
BT->data=ch; //生成根节点
BinTreeCreat(BT->lchild); //构造左子树
BinTreeCreat(BT->rchild); //构造右子树
}
}
void PreOrderBinTraverse(BitNode *BT) //构建先序遍历
{
if(NULL!=BT) //为了防止把NULL赋值给BT
{
printf("%c",BT->data);
PreOrderBinTraverse(BT->lchild);
PreOrderBinTraverse(BT->rchild);
}
}
void PreOrderBinTraverse2(BitNode *BT) //利用栈来弹出输出数据
{
BitNode *p;
Stack s;
s.top=-1;
if(NULL==BT)
{
return;
}
else
{
s.top++;
s.a[s.top]=BT;
while(s.top!=-1)
{
p=s.a[s.top];
s.top--;
printf("%c",p->data); //这里是弹出什么 ? 是怎么入栈出栈的?
if(p->rchild!=NULL)
{
s.top++;
s.a[s.top]=p->rchild;
}
if(p->lchild!=NULL)
{
s.top++;
s.a[s.top]=p->lchild;
}
}
}
}
void InOrderBinTraverse(BitNode *BT) //中序遍历
{
if (NULL!=BT)
{
InOrderBinTraverse(BT->lchild);
printf("%c ",BT->data);
InOrderBinTraverse(BT->rchild);
}
}
void InOrderBinTraverse2(BitNode *BT)
{
BitNode *p,*q;
Stack s;
s.top=-1;
if(NULL==BT)
{
return;
}
else
{
while(BT!=NULL)
{
s.top++;
s.a[s.top]=BT;
BT=BT->lchild; //指向最左下方
}
while(p->lchild!=NULL)
{
p=s.a[s.top];
s.top--;
printf("%c",p->data); //弹出最左下方的
while(p->rchild!=NULL) //第一次是判断,最左下方的右子树
{
s.top++;
s.a[s.top]=p->rchild;
q=p->rchild;
while(q->lchild!=NULL)
{
s.top++;
s.a[s.top]=q->lchild;
q=q->lchild;
}
break;
}
}
}
}
void PostOrderBinTraverse(BitNode *BT) //后序遍历
{
if(BT!=NULL)
{
PostOrderBinTraverse(BT->lchild);
PostOrderBinTraverse(BT->rchild);
printf("%c",BT->data);
}
}
void PostOrderBinTraverse2(BitNode *BT)
{
Stack s;
s.top=-1;
BitNode *t;
int flag;
do
{
while (BT!=NULL)
{
s.top++;
s.a[s.top]=BT;
BT=BT->lchild;
}
t=NULL;
flag=1;
while (s.top!=-1 && flag)
{
BT=s.a[s.top];
if (BT->rchild==t) //t:表示为null,或者右子节点被访问过了。
{
printf("%c ",BT->data);
s.top--;
t=BT; //t记录下刚刚访问的节点
}
else
{
BT=BT->rchild;
flag=0;
}
}
} while (s.top!=-1);
}
int Height(BitNode *BT) //求高度
{
int depth1,depth2;
if (NULL==BT)
{
return 0;
}
else
{
depth1=Height(BT->lchild);
depth2=Height(BT->rchild);
if (depth1>depth2)
{
return (depth1+1);
}
else
{
return (depth2+1);
}
}
}
int main()
{
BitNode *btr;
BinTreeCreat(btr);
printf("前序遍历:递归和非递归实现:\n");
PreOrderBinTraverse(btr);
printf("\n");
PreOrderBinTraverse2(btr);
printf("\n");
printf("中序遍历:递归和非递归实现:\n");
InOrderBinTraverse(btr);
printf("\n");
InOrderBinTraverse2(btr);
printf("\n");
printf("后序遍历:递归和非递归实现:\n");
PostOrderBinTraverse(btr);
printf("\n");
PostOrderBinTraverse2(btr);
printf("\n");
printf("二叉树的高度:\n");
int Hgt=Height(btr);
printf("%d \n",Hgt);
printf("\n");
return 0;
}
还有前序遍历时候的, 那p->data的问题, 麻烦帮忙解决一下下了,最好是多给点注释, 真心感谢了。