二叉树递归和非递归前中后序遍历详解(浙江大学数据结构)

最近在mooc上看到浙大数据结构课,对于二叉树的讲解很详细,我就来总结一下我的学习笔记

1.先序遍历递归
在这里插入图片描述

2.中序遍历递归
在这里插入图片描述

3.后序遍历递归
在这里插入图片描述

在这里插入图片描述
按照叉号读出来的顺序是前序遍历,正好是第一次经过该节点

按照星号读出来的顺序是中序遍历,正好是第二次经过该节点

按照三角形读出来的顺序是后序遍历,正好是第三次经过该节点

按照第1、2、3次经过该节点读出来的顺序就是二叉树的 前、中、后 遍历了,且每个节点被经过了3次,这样的话,我们实现非递归遍历的话,就只要在合适的时机把数据输出,这里我们利用堆栈

1.先序遍历的非递归遍历算法

void InOrderTraversal(BinTree BT)
{
	BinTree T BT;
	stack S=CreatStack(Maxsize);/*创建并初始化堆栈S*/
	while(T ||!IsEmpty(S))
	{
		while(T)/*一直向左并将沿途结点压入堆栈*/
		{
			printf("%5d",T->Data);/*(访问)打印结点*/
			Push(S,T);
			T=T->Left;
		}
		if(!IsEmpty(S))
		{
			T=Pop(S);/*结点弹出堆栈*/
			T=T->Right;/*转向右子树*/
		}
	}
}

2.中序遍历非递归遍历算法
遇到一个结点,就把它压栈,并去遍历它的左子树;
当左子树遍历结束后,从栈顶弹出这个结点并访问它;
然后按其右指针再去中序遍历该结点的右子树。

void InOrderTraversal(BinTree BT)
{
	BinTree T BT;
	stack S=CreatStack(Maxsize);/*创建并初始化堆栈S*/
	while(T ||!IsEmpty(S))
	{
		while(T)/*一直向左并将沿途结点压入堆栈*/
		{
			Push(S,T);
			T=T->Left;
		}
		if(!IsEmpty(S))
		{
			T=Pop(S);/*结点弹出堆栈*/
			printf("%5d",T->Data);/*(访问)打印结点*/
			T=T->Right;/*转向右子树*/
		}
	}
}

3.后序遍历的非递归遍历算法

void InOrderTraversal(BinTree BT)
{
	while(T|| !IsEmpty(S))
	{
		while(T)
		{
	        push(S,T);
	        T=T->Left;
	    }    
	   	if(IsEmpty(s))
		{
	       	T=pop(S,T); /*这个POP有着第二次和第三次遇到两个功能,如果是最左边的节点,就不用等到第三次遇到再输出,或者说第三次和第二次遇到是一起的*/
	       	if(T->Right && T->Right != Temp)/*如果该节点还有右子树,并且和上一次经历的右边节点不同,就转向右边,同时刚刚POP出来的节点重新入栈。*/
			{  
	           	push(S,T);
	          	T=T->Right;
	           	Temp=T;/*储存已经走过的右边节点*/
	        }
	       	else
			{
	           	printf("%5d",T->Data);  
				T=NULL;
			}
		}
	}
}
发布了149 篇原创文章 · 获赞 84 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/weixin_43465312/article/details/92397219