【数据结构】用栈实现二叉树的前中后序遍历

一、前序遍历

准备工作:将当前所指的二叉树节点入栈。

循环条件:栈非空。

循环内操作:出栈,输出该数据。并将出栈节点的孩子节点入栈,顺序为先右孩子,再左孩子,原因当然是因为前序遍历,接下来要处理的(要出栈的)应该是左孩子呀。

void Travel_Pre_Stack(Tree parent)
{
	if (parent != NULL)
	{
		Tree stack[MAXSIZE];
		int top = -1;

		stack[++top] = parent;

		while (top != -1)
		{
			Tree Node_pop= stack[top--];
			cout << Node_pop->data << " ";
			if (Node_pop->rchild != NULL)
			{
				stack[++top] = Node_pop->rchild;
			}
			if (Node_pop->lchild != NULL)
			{
				stack[++top] = Node_pop->lchild;
			}
			
		}
	}
}

二、中序遍历

思路:中序遍历,理解起来,就是先把左孩子的最小事件解决了,再解决该节点的事情,再来处理右孩子的事情。右孩子当然要当做一个新的二叉树来处理,先处理左孩子的最小事件,再它本身,再处理右孩子。所以这就是循环了。

循环条件:栈不空或者出栈元素的右孩子不为空

其中右孩子不为空这个条件,很关键。好好理解哦。举例子就是仅有一个右孩子,右孩子没有孩子的二叉树。

void Travel_Mid_Stack(Tree parent)
{
	if (parent == NULL)
	{
		return;
	}
	Tree stack[MAXSIZE];
	int top = -1;
	
	stack[++top] = parent;
	Tree LeftChild = parent->lchild;

	while (top != -1|| LeftChild!=NULL)
	{
		while (LeftChild != NULL)
		{
			stack[++top] = LeftChild;
			LeftChild=LeftChild->lchild;
		}

		Tree Node_pop = stack[top--];
		cout << Node_pop->data << " ";
		LeftChild = Node_pop->rchild;
	}
}

三、后序遍历

思路:

1.将一颗健康的二叉树每个节点的左右子树交换

2.前序遍历这颗畸形的二叉树

3.再将结果逆序输出。

不过在实际操作中,我们没有必要将左右子树交换。只需要在前序遍历过程中,孩子入栈的顺序颠倒,即先进入左孩子,再进入右孩子。这样就相当于实现了左右子树交换的目的。

将出栈的元素进入一个新的栈B,到时候再依次出栈,相当于实现了逆序输出。

void Travel_Post_Stack(Tree parent)
{
	if (parent == NULL) return;

	Tree StackA[MAXSIZE];
	int top_A = -1;
	Tree StackB[MAXSIZE];
	int top_B = -1;

	StackA[++top_A] = parent;

	while (top_A != -1)
	{
		Tree Node_pop=StackA[top_A--];
		//这里是画龙点睛之笔 实现了在前序遍历的同时又交换了左右子树的顺序
		//其实思路很简单,就是左先入栈,右再入栈,实现先处理右节点,再处理左节点。
		if (Node_pop->lchild != NULL)
		{
			StackA[++top_A] = Node_pop->rchild;
		}
		if (Node_pop->rchild != NULL)
		{
			StackA[++top_A] = Node_pop->lchild;
		}

		//将要输出的数据入栈,从而实现数据逆序排列。
		StackB[++top_B] = Node_pop;

	}

	//
	while (top_B != -1)
	{
		Tree Node_pop = StackB[top_B--];
		cout << Node_pop->data << " ";
}

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值