二叉树的遍历

Posted 小倪同学 -_-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历相关的知识,希望对你有一定的参考价值。

二叉树的构建

为了方便下文对二叉树的遍历,我们先自己构建一棵二叉树

二叉树的结点

二叉树每个结点只有左右两个分支,我们可以参考链表构建一个结构体,让其有两个指针分别指向左结点,右结点。

typedef char BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;				//可以根据需要改变存储数据类型
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

二叉树的初始化

先对结点初始化,再将结点赋值相连,代码如下

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

BTNode* CreatBinaryTree()
{
	BTNode* node1 = BuyNode('A');
	BTNode* node2 = BuyNode('B');
	BTNode* node3 = BuyNode('C');
	BTNode* node4 = BuyNode('D');
	BTNode* node5 = BuyNode('E');
	BTNode* node6 = BuyNode('F');

	node1->left = node2;
	node1->right = node3;
	node2->left = node4;
	node3->left = node5;
	node3->right = node6;
	return node1;
}

构建的二叉树如图

二叉树的前序遍历

二叉树构建好了,下面开始遍历了

前序遍历是访问根结点的操作发生在遍历其左右子树之前。即先访问它的根结点再访问它的左节点,右结点

这里需要用到递归思想,代码如下

void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

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

下图是递归的过程,方便大家理解

运行结果

中序遍历

中序遍历是访问根结点的操作发生在遍历其左右子树之中,即先访问左结点,再访问根结点,最后再访问右结点

代码如下

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

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

运行结果

后序遍历

后序遍历是访问根结点的操作发生在遍历其左右子树之后,即先访问左结点,再访问右结点,最后再访问根结点

代码如下

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

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

运行结果

层序遍历

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

如图所示


层序遍历不是利用递归而是利用队列实现,思路如下

  1. 将根结点入队列
  2. 访问时出队列,访问出队列的那个结点
  3. 每访问一个结点,将其左右子结点放入队列中
  4. 重复上述操作,直到队列为空

代码如下

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

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

		if (front->left)
		{
			QueuePush(&q, front->left);
		}

		if (front->right)
		{
			QueuePush(&q, front->right);
		}
	}
	printf("\\n");

	QueueDestroy(&q);
}

上述代码用到了队列的函数,可以参考博主之前写的文章数据结构之队列

运行结果

以上是关于二叉树的遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历

讲透学烂二叉树:二叉树的遍历图解算法步骤及JS代码

二叉树(2.二叉树的遍历和实现)

根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

代码题— 二叉树的层次遍历