求一个c语言遍历二叉树的算法

具体要求如下:二叉树节点含3个指针域:rchild、lchild和parents和数据域。要求设计中序遍历算法(依次调用visit函数),不建立堆栈不用递归。谢谢!... 具体要求如下: 二叉树节点含3个指针域:rchild、lchild和parents和数据域。要求设计中序遍历算法(依次调用visit函数),不建立堆栈不用递归。 谢谢! 展开
 我来答
百度网友9fbc01c
推荐于2016-07-22 · 超过42用户采纳过TA的回答
知道小有建树答主
回答量:118
采纳率:0%
帮助的人:99万
展开全部
#include <stdio.h>
#include <stdlib.h>
//1 根据二叉树的性质5,结点按完全二叉树来编号,则根据结点编号,
// 就可算出其双亲结点的编号,以及该结点是左孩子还是右孩子,
// 这样一来,就可把该结点的指针赋予双亲结点的相应指针域。
// 怎样找到双亲结点呢?,在输入双亲结点的同时要把结点的指针
// 保存起来。也就是说,要设计一个指针数组,来保存每个结点指针。
// 这样,当输入下层结点时,才能找到它的双亲。
//2 回想单链表的建立过程,单链表建立过程中,只需把当前结点,
// 当成前驱结点,故只需设计一个指针变量即可。

typedef char ElementType;

typedef struct node //二叉树链表结点
{
ElementType data;
struct node *lchild,*rchild;//左、右孩子指针
}BinNode,*BinTree; //结点和结点指针的标识符

BinNode * creat(void) //建二叉树链表(返回根结点的指针)
{
int i,j;
ElementType x;
BinNode *q,*s[20];//结点指针、辅助数组(存放结点的指针,该结点有可能是双亲结点)
BinNode *t=NULL; //根结点指针(目前是空树,生成树后要返回根结点指针)

printf("\n 请输入结点编号i和结点值x");
printf("\n 如:1A 2B 3C 4D 5E 7F 00(全为0,输入结束)");
printf("\n 或:1A 2B 3C 4D 6F 7G 00(全为0,输入结束)");
printf("\n 或:1A 2B 3C 5E 7G 15M 00(全为0,输入结束)\n");
scanf("%d%c",&i,&x); //输入结点编号及结点值

while((i!=0)&&(x!=0))
{
q=(BinNode *)malloc(sizeof(BinNode));//申请结点内存
q->data=x; //保存数据
q->lchild=NULL;
q->rchild=NULL;
s[i]=q; //s[i]存放第i号结点的指针
if(i==1) //1号结点是根结点
t=q; //保存根结点指针,以备返回
else
{
j=i/2; //由该结点号求双亲结点号
if((i%2)==0)
s[j]->lchild=q; //i为偶数是左孩子,该结点指针存入双亲结点的左孩子指针
else
s[j]->rchild=q; //i为奇数是右孩子,该结点指针存入双亲结点的右孩子指针
}
scanf("%d%c",&i,&x);//继续输入结点编号和结点值
}
return t; //返回根结点的指针(二叉链表的指针)
}

void DisplayBinTree(BinTree T)//用缩进表示二叉树
{
BinTree stack[100],p; //栈(结点指针数组)、当前结点指针
int level[100]; //栈(每层根结点对应的空格 数 )
int flag[100]; //栈(flag[]=0,1,2分别表示是根结点、左子树、右子树 )
int top,n,i; //栈顶指针,空格个数,循环变量

if(T!=NULL) //若有根结点
{
top=1; //1号结点(根结点 )
stack[top]=T; //入栈(保存根结点指针)
level[top]=1; //显示空格的个数
flag[top]=0; //根结点
while(top>0) //有根结点
{
p=stack[top]; //取根结点指针
n=level[top]; //取显示空格的个数

for(i=1;i<=n;i++)//显示空格(缩进)
printf(" ");

if(flag[top]==0) //若是根结点
printf("T:%c\n",p->data); //显示根结点
else //不是根结点
{
if(flag[top]==2) //是右子树根结点
printf("R:%c\n",p->data); //显示右子树根结点
if(flag[top]==1) //是左子树根结点
printf("L:%c\n",p->data,top); //显示左子树根结点
}

top--; //显示一个(出栈一个)结点,top-1

if(p->rchild!=NULL)//若有右孩子
{
top++; //保存一个根结点,top+1
stack[top]=p->rchild;//保存右子树根结点
level[top]=n+3;
flag[top]=2;
}
if(p->lchild!=NULL)//若有左孩子
{
top++;
stack[top]=p->lchild;//保存左子树根结点
level[top]=n+3;
flag[top]=1;
}
// printf("level[top]=%d\n",level[top]);
}
}
}

main()
{
BinNode *T; //根结点的指针
T=creat(); //建二叉树
printf("\n用缩进表示二叉树的层次(如ppt62所示):\n");
DisplayBinTree(T);
getch();
}
painfulmiss
2013-07-19 · TA获得超过247个赞
知道小有建树答主
回答量:244
采纳率:0%
帮助的人:192万
展开全部

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式