二叉树建立 递归先序遍历 非递归先序遍历

本文介绍了如何使用递归和非递归方式实现二叉树的先序遍历,详细讲解了两种方法的步骤与实现细节,并提供了C语言的实现代码示例。
#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值