首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个关于树的程序的奇怪现象!解决思路

2012-09-11 
一个关于树的程序的奇怪现象!//源代码#includestdio.h#includestdlib.htypedef char TElemTypetypede

一个关于树的程序的奇怪现象!
//源代码
#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;
}

这里不就改变了节点了吗

热点排行
Bad Request.