💞💞 前言
hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
💥个人主页:大耳朵土土垚的博客
💥 所属专栏:数据结构学习笔记 、C语言系列函数实现
💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信我哦~
复习巩固:🥳🥳
在学习二叉树基本操作前,再回顾下二叉树的概念,二叉树是:
- 空树
- 非空:根节点,根节点的左子树、根节点的右子树组成的。
从概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。
一、手动创建一个简单二叉树🥳🥳
在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。
手动创建简单二叉树代码如下:
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。
代码如下:
// 二叉树前序遍历
void PreOrder(BTNode* root)
{if (root)//如果root为NULL就不需要进入if语句直接退出函数{printf("%d\n", root->data);PreOrder(root->left);PreOrder(root->right);}
}
递归图解如下:
结果如下:
2.中序
中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
也就是先访问左子树再访问根结点最后访问右子树,先访问的左子树也是先访问其左子树再访问根结点最后访问右子树…直到遍历完全部结点。
代码如下:
// 二叉树中序遍历
void InOrder(BTNode* root)
{if (root){InOrder(root->left);printf("%d\n", root->data);InOrder(root->right);}
}
结果如下:
3.后序
后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。
也就是先访问左子树再访问右子树最后访问根结点,再访问左子树时也是按照左子树——右子树——根结点的顺序访问…直到遍历整个二叉树。
代码如下:
// 二叉树后序遍历
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到了吗, 完结撒花 ~🥳🥳🎉🎉🎉