二叉树的前序、中序、后序遍历的算法(递归形式和非递归形式)

//前序遍历非递归算法
#define maxsize 100

typedef struct 
{
	int value;
	Bitree *lchild;
	Bitree *rchild;
}Bitree;

typedef struct
{
	Bitree Elem[maxsize];
	int top;
}SqStack;

void PreOrderUnrec(Bitree *t)
{
	SqStack s;
	StackInit(s);
	Bitree *p = t;

	while (p != NULL || !StackEmpty(s))
	{
		while (p != NULL)				//遍历左子树
		{
			visit(p->data);
			push(s, p);
			p = p->lchild;
		}
		
		if (!StackEmpty(s))				//通过下一次循环中的内嵌while实现右子树遍历  
		{
			p = pop(s);
			p = p->rchild;
		}
	}
}

//中序遍历非递归算法
void InOrderUnrec(Bitree *t)
{
	SqStack s;
	StackInit(s);
	Bitree *p = t;

	while (p != NULL || !StackEmpty(s))
	{
		while (p != NULL)			//遍历左子树
		{
			push(s, p);
			p = p->lchild;
		}
		if (!StackEmpty(s))
		{
			p = pop(s);
			visit(p->data);			//访问根结点
			p = p->rchild;			 //通过下一次循环实现右子树遍历
		}
	}
}

//后序遍历非递归算法
typedef enum{L, R} tagtype;
typedef struct  
{
	Bitree ptr;
	tagtype tag;
}stacknode;

void PostOrderUnrec(Bitree *t)
{
	SqStack s;
	stacknode x;
	StackInit(s);
	Bitree *p = t;

	do 
	{
		while (p != NULL)		//遍历左子树
		{
			x.ptr = p;
			x.tag = L;			//标记为左子树
			push(s, x);
			p = p->lchild;
		}
		
		while (!StackEmpty(s) && s.Elem[s.top].tag == R)
		{
			x = pop(s);
			p = x.ptr;
			visit(p->data);		//tag为R,表示右子树访问完毕,故访问根结点
		}

		if (!StackEmpty(s))
		{
			s.Elem[s.top].tag = R;
			p = s.Elem[s.top].ptr->rchild;
		}
	} while (!StackEmpty(s));
}


//递归算法:
//前序遍历:
void preorder(BTree *T)
{
	//T为二叉树根结点所在链接点的地址
	if(T != NULL)
	{
		visit(T);                 //访问T所指结点
		preorder(T->lchild);      //遍历T所指结点的左子树
		preorder(T->rchild);      //遍历T所指结点的右子树
	}
}

//中序遍历:
void inorder(BTree *T)
{
	//T为二叉树根结点所在链接点的地址
	if(T != NULL)
	{
		inorder(T->lchild);       //遍历T所指结点的左子树
		visit(T);                 //访问T所指结点
		inorder(T->rchild);       //遍历T所指结点的右子树
	}
}
//后序遍历:
void postorder(BTree T)
{
	//T为二叉树根结点所在链接点的地址
	if(T != NULL)
	{
		postorder(T->lchild);       //遍历T所指结点的左子树
		postorder(T->rchild);       //遍历T所指结点的右子树
		visit(T);                 //访问T所指结点
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值