数据结构 树(三)二叉树的遍历 : 前序遍历、中序遍历、后序遍历、层序遍历

二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树的所有节点,使得每个节点被访问且只访问一次。
而一般有四种遍历方法:
前序、中序、后序、层序,下面就分别讲一下四个遍历的思路以及代码实现

例如我们以下面这个字符串用先序遍历来建树

char str[] = "ABD##E##CF##G##";

因为这里主要讲解的是四种遍历,所以建树以及其他的操作会放到下节

构成的树如下:
在这里插入图片描述


前序遍历

前序遍历就是先访问根节点,再访问左子树,最后访问右子树。
因为我们的树的链式的结构,是通过递归的方式创建的,所以我们以递归的形式就能更好的理解遍历的思路

在这里插入图片描述
首先我们访问根节点D,然后访问根节点的左子树B,然后递归下去访问B的左子树D,因为D是叶子节点,所以回到B,访问B的右子树E,E也是叶子节点,而A左边的子树全部遍历,接下来访问右子树C,然后分别访问C的左子树F和右子树G
顺序就是ABDECFG

下面来代码实现

void BinaryTreePrevOrder(BTNode* root)
{
	if (!root)
		return;

	printf("%c ", root->data);
	BinaryTreePrevOrder(root->left);
	BinaryTreePrevOrder(root->right);
}

代码很好理解,先访问根节点,然后递归访问左子树和右子树。
在这里插入图片描述


中序遍历

中序遍历就是先访问左子树,再访问根节点,最后访问右子树。

在这里插入图片描述
因为我们从根节点出发,一直递归访问左子树,直到D才停下,所以第一个节点是D,然后走到D的根节点B,按照根左右的顺序访问B的右子树E,然后A的左子树访问完了,访问根节点A,接下来向右递归,走到C的左子树,然后像前面一样,访问根节点C和C的右子树G
顺序:DBEAFCG
下面来代码实现

void BinaryTreeInOrder(BTNode* root)
{
	if (!root)
		return;

	BinaryTreeInOrder(root->left);
	printf("%c ", root->data);
	BinaryTreeInOrder(root->right);

}

首先递归访问左子树,再访问根节点,在递归访问右子树
在这里插入图片描述


后序遍历

后序遍历就是先访问左子树,再访问右子树,最后访问根节点。
在这里插入图片描述
首先递归左子树到D,从D开始出发,按照左子树->右子树->根节点的顺序遍历B的左子树D,B,B的右子树E,因为A的左子树遍历完了,递归进入右子树,然后像上面一样,遍历C的左子树F,C,C的右子树G。
顺序:DEBFGCA

下面来代码实现

void BinaryTreePostOrder(BTNode* root)
{
	if (!root)
		return;
	BinaryTreePostOrder(root->left);
	BinaryTreePostOrder(root->right);
	printf("%c ", root->data);
}

先访问左右子树再访问根节点

在这里插入图片描述


层序遍历

层序遍历顾名思义,就是一层一层往下遍历
在这里插入图片描述
遍历顺序:ABCDEFG
就是一层一层遍历

看起来简单,但是代码实现却比前面几个复杂,我们需要用到队列来实现层序遍历
思路如下:
首先当根节点不为空时,将根节点入队列,然后输出根节点后再将根节点出栈,然后将(不为空的)左右子树入队列,不断循环往下直到所有节点都入队列后队列,直到队列为空
代码实现如下:

void BinaryTreeLevelOrder(BTNode* root)
{
	Queue q;
	QueueInit(&q);
	if(root)
		QueuePush(&q, root);

	while (!QueueEmpty(&q))
	{
		BTNode* node = QueueFront(&q);
		QueuePop(&q);
		printf("%c ", node->data);


		if(node->left)
			QueuePush(&q, node->left);
		if(node->right)
			QueuePush(&q, node->right);
	}
	printf("\n");
	QueueDestroy(&q);
}

在这里插入图片描述

发布了60 篇原创文章 · 获赞 78 · 访问量 6322

猜你喜欢

转载自blog.csdn.net/qq_35423154/article/details/104887553