一个关于树的程序的奇怪现象!
//源代码
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍历递归生成树
void CreateBiTree(BiTree &T)
{
TElemType ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
//T=new(BiTNode);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T)
{
if(T!=NULL)
{
printf(" %c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T)
{
if(T!=NULL)
{
InOrderTraverse(T->lchild);
printf(" %c",T->data);
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T)
{
if(T!=NULL)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf(" %c",T->data);
}
}
//先序遍历(非递归)***********************************************
//需要保存访问根节点
void PreOrderTraverse2(BiTree T)
{
BiTree p,q,m;
int other=0;
p=T;
m=T->rchild;
q=NULL;
while(p!=NULL)
{
printf(" %c",p->data);
if(p->lchild!=NULL)
{
q=p;
p=p->lchild;
}
else if(p->rchild!=NULL)
{
p=p->rchild;
//q->rchild=NULL;
}
else if(q->rchild!=NULL)
{
p=q->rchild;
q->rchild=NULL;
}
else if(m!=NULL && other==0)
{
p=m;
other=1;
}
else
p=NULL;
}
}
//先序遍历(非递归)***********************************************
int main()
{
BiTree T;
printf("请输入树的结点元素:"); //输入:ABC##D##EF##G##
CreateBiTree(T);
printf("先序遍历结果: ");
PreOrderTraverse(T);
printf("\n");
printf("先序遍历(非递归)结果:");
PreOrderTraverse2(T);
printf("\n\n");
printf("中序遍历结果: ");
InOrderTraverse(T);
printf("\n\n");
printf("后序遍历结果: ");
PostOrderTraverse(T);
printf("\n\n");
return 0;
}
输入:ABC##D##EF##G##
问题:为什么主函数中PreOrderTraverse2(T)运行完毕之后,会将原来树的结构改变了(输出的中,后序遍历结果中中少了几个元素),究竟这个函数的问题出在哪里?求指教!
[解决办法]
else if(q->rchild!=NULL)
{
p=q->rchild;
q->rchild=NULL;
}
这里不就改变了节点了吗