前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构——二叉树的遍历【前序、中序、后序】

数据结构——二叉树的遍历【前序、中序、后序】

作者头像
大耳朵土土垚
发布2024-03-13 18:51:34
1790
发布2024-03-13 18:51:34
举报
文章被收录于专栏:c/c++c/c++

复习巩固:??

在学习二叉树基本操作前,再回顾下二叉树的概念,二叉树是:

  1. 空树
  2. 非空:根节点,根节点的左子树、根节点的右子树组成的。

从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。

一、手动创建一个简单二叉树??

在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。

手动创建简单二叉树代码如下:

代码语言:javascript
复制
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{
	BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	newnode->right = NULL;
	newnode->data = x;
	newnode->left = NULL;
	return newnode;
}
BTNode* CreatBinaryTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);

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

创建的二叉树逻辑结构如下图:

??注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解。

二、二叉树的三种遍历??

学习二叉树结构,最简单的方式就是遍历。 所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。

1.前序

前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。 也就是先访问根结点在访问左子树右子树,左子树也是先访问根结点再访问左子树右子树…直到结束出现NULL;

前序遍历递归图解:

??这里要注意访问叶子结点时要将它左右也就是NULL访问,这样才不会出差错。不能说它没有左右子树,而是它的孩子结点为NULL。

代码如下:

代码语言:javascript
复制
// 二叉树前序遍历
void PreOrder(BTNode* root)
{
	if (root)//如果root为NULL就不需要进入if语句直接退出函数
	{
		printf("%d\n", root->data);
		PreOrder(root->left);
		PreOrder(root->right);
	}
}

递归图解如下:

结果如下:

2.中序

中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。 也就是先访问左子树再访问根结点最后访问右子树,先访问的左子树也是先访问其左子树再访问根结点最后访问右子树…直到遍历完全部结点。

代码如下:

代码语言:javascript
复制
// 二叉树中序遍历
void InOrder(BTNode* root)
{
	if (root)
	{
		InOrder(root->left);
		printf("%d\n", root->data);
		InOrder(root->right);
	}
}

结果如下:

3.后序

后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。 也就是先访问左子树再访问右子树最后访问根结点,再访问左子树时也是按照左子树——右子树——根结点的顺序访问…直到遍历整个二叉树。

代码如下:

代码语言:javascript
复制
// 二叉树后序遍历
void PostOrder(BTNode* root)
{
	if (root)
	{
		PostOrder(root->left);
		PostOrder(root->right);
		printf("%d\n", root->data);

	}
}

结果如下:

三、小练习??

解答:

四、结语??

??由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

以上就是二叉树前中后序的遍历啦~学习它对我们后续学习二叉树的操作有很大作用同时也帮我们复习和了解递归的使用,可谓一举两得,大家都get到了吗, 完结撒花 ~?????

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 复习巩固:??
  • 一、手动创建一个简单二叉树??
  • 二、二叉树的三种遍历??
    • 1.前序
      • 2.中序
        • 3.后序
        • 三、小练习??
        • 四、结语??
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com