【Lehr】【数据结构与算法】【C语言】二叉树的递归遍历

现在有这样一颗二叉树:
在这里插入图片描述

先序遍历

思路与代码

按照:本节点,左子树,右子树 的顺序遍历

void PriorOrder(BTNode* b) 
{
	if(b)
	{
		printf("%c", b->data);
		PriorOrder(b->lchild);
		PriorOrder(b->rchild);	
	}
} 

过程分析

一开始,我们会先遍历最顶上的树(红色方框内)
这个数的三个部分:根节点,左子树,右子树,分别由蓝色方框圈起来
我们首先访问本节点A,然后访问左子树,也就是蓝色方框内的左边的整体
a在这里插入图片描述

在这里插入图片描述
现在单独把左子树提出来看,也是一样的方法:先访问B,然后访问左节点,D,然后再访问右子树。
在这里插入图片描述
我们再把右子树提出来:还是一样,先访问E再访问H,然后现在,最开始ABC组成的数的根节点和左子树都访问完了,所以现在开始去访问ABC这个数的右节点
在这里插入图片描述
ABC树的右节点:
在这里插入图片描述
同理像上面那样访问即可。
最终访问顺序:A B D E H C F I J G

中序遍历

思路与代码

按照:左节点,本节点,右节点 的顺序遍历

void InOrder(BTNode* b) 
{
	if(b)
	{
		InOrder(b->lchild);
		printf("%c", b->data);
		InOrder(b->rchild);	
	}
} 

过程还是和上面一样,只不过先把左子树访问完。
输出顺序:D B H E A F J I C G

后续遍历

思路与代码

按照:左节点,右节点 ,本节点 的顺序遍历


void PostOrder(BTNode* b) 
{
	if(b)
	{
		PostOrder(b->lchild);
		PostOrder(b->rchild);
		printf("%c", b->data);	
	}
} 

输出顺序:D H E B J I F G C A

层次遍历

思路与代码

按照:根节点,第一层,第二层…的顺序遍历

void LevelTraversal(BTNode* b)
{
	if(b)
	{
		//定义队列 
		BTNode* queue[MaxSize];
		int top=0;
		queue[top] = b;
		int i = 0;
		
		//只要队列里有元素 
		while(i<=top)
		{
			//将左右子树加入队列 
			if(queue[i]->lchild)
			{
				top++;
				queue[top] = queue[i]->lchild;	
			}
			if(queue[i]->rchild)
			{
				top++;
				queue[top] = queue[i]->rchild;	
			}
			i++;
		}

		//现在这个队列按层次顺序容纳了二叉树的每个节点	
		for(i=0;i<=top;i++)
		{
			//挨个打出来即可 
			printf("%c", queue[i]->data);
		}			
		//我比较懒所以就没写出队,这其实当成个栈也可以 
	}  			
} 

很显然,是一层一层的访问,所以顺序就是A B C D E F G H I J

发布了33 篇原创文章 · 获赞 26 · 访问量 2610

猜你喜欢

转载自blog.csdn.net/qq_43948583/article/details/91357311