#include <stdio.h>
#include <malloc.h>
typedef struct Bitree{char data;Bitree *Lc;Bitree *Rc;}Bitree,*Bitnode; //二叉树数据类型
typedef struct stack {Bitnode root;struct stack *next;}stack,*Linkstack; //存储二叉树结点的栈的数据类型
int initstack (Linkstack &S); //初始化栈
int push (Linkstack &S,Bitnode p); //压栈
int pop (Linkstack &S,Bitnode &p); //弹栈
int judg (Linkstack &S); //判断栈
int create (Bitnode &T); //建立二叉树
int output_1 (Bitnode &T); //递归遍历二叉树
int output_2(Bitnode &T); //非递归遍历二叉树
int main()
{
Bitnode T;
printf ("构建二叉树\n");
create (T);
printf ("递归先序遍历\n");;
output_1(T);
printf ("\n");
printf ("非递归先序遍历\n");
output_2(T);
}
int create (Bitnode &T)
{
char c;
scanf (" %c",&c);
if (c=='*') //当输入*时当前根结点置空
T=NULL;
else
{
if (T) //如果T非空
{
T=(Bitnode)malloc (sizeof (Bitree));
T->data=c; //根结点赋值
create (T->Lc); //构造左子树
create (T->Rc); //构造右子树
}
}
return 0;
}
int output_1 (Bitnode &T)
{
if (T)
{ //递归先序遍历
printf ("%c ",T->data);
output_1 (T->Lc);
output_1 (T->Rc);
}
return 0;
}
int output_2(Bitnode &T) //非递归先序遍历
{
Linkstack S;
initstack(S); //栈初始化
Bitnode p,q; //树结点类型的变量
p=T;
while (p||!judg(S)) //当p不为空 或 栈不为空时 循环执行
{
while (p) //当p不为空时
{
printf ("%c ",p->data); //输出p根的值
push (S,p); //把p压栈
p=p->Lc; //p指向左子树
}
if (!judg(S)) //栈非空
{
pop (S,q); //当前栈顶元素出栈(之前的左子树的根)
p=q->Rc; //左子树为空的根的右子树
}
}
return 0;
}
int initstack (Linkstack &S) //栈初始化
{
S=NULL; //置空
return 0;
}
int push (Linkstack &S,Bitnode p)
{
Linkstack c;
c=(Linkstack)malloc(sizeof (stack)); //分配空间
c->root=p; //赋值
c->next=S;
S=c; //尾插
return 0;
}
int pop (Linkstack &S,Bitnode &p) //出栈
{
Linkstack c;
p=S->root; //赋值给p带回
c=S; //纪录当前结点S
S=S->next;
free (c); //删除纪录
return 0;
}
int judg (Linkstack &S)
{
if (S==NULL)
return NULL; //判断当前栈是否为空
else
return !NULL;
}
二叉树建立 递归先序遍历 非递归先序遍历
最新推荐文章于 2024-12-10 00:04:27 发布
本文介绍了如何使用递归和非递归方式实现二叉树的先序遍历,详细讲解了两种方法的步骤与实现细节,并提供了C语言的实现代码示例。
938

被折叠的 条评论
为什么被折叠?



