二叉树及其先序、中序、后序遍历

本节内容:

  • 二叉树定义
  • 完全二叉树
  • 满二叉树
  • 先序、中序、后序遍历
  • 已知先序遍历、中序遍历求后序遍历
  • 已知中序遍历、后序遍历求先序遍历

二叉树定义

这里写图片描述
二叉树:二叉树是每个节点最多只有两个分支(不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”和“右子树”。二叉树的分支具有左右次序,不能颠倒。
节点:树的每个元素都是一个节点。(上图有9个节点)
根节点:没有父节点的节点。(8为根节点)
叶节点:没有子节点的节点。(1,4,7,13都是叶节点)
深度:(这就很烦了,不同地方的定义有所不同,维基百科上定义根节点的深度为0,其他很多地方定义根节点深度为1,这里采用树的深度从1开始)从根节点为 1 开始,树中结点最大层次的值就是树的深度。上图树的深度为4。
:节点的子节点个数为节点的度。所有节点最大的度就是树的度。二叉树的度最大为2。

完全二叉树和满二叉树

学习最困难的地方不在于知识到底有多难,最特么难的地方就是各个地方标准和定义都不一样。完全二叉树和满二叉树在各个地方的定义就有所不同,但是这两种树又比较重要,所以还是说一说。

这里写图片描述

满二叉树(full Binary Tree):树上所有的节点,要么是叶节点,要么有两个子节点。(除了叶节点外所有节点都有两个子节点的树就是满二叉树)
完全二叉树(Complete Binary Tree):除了最后一层外,其他各层都是满的,最下面一层的结点都集中在该层最左边的若干位置。

先序、中序、后序遍历

先序遍历:先根、再左、后右
中序遍历:先左、再根、后右
后续遍历:先左、再右、后根

这里写图片描述
先说答案:
先序遍历:ABCDFEGHIJKLM
中序遍历:CFDEBGJILMKHA
后序遍历:FEDCJMLKIHGBA

看待这里是不是一脸懵逼?是不是发现自己就像个智障?发现除了先序遍历以外自己啥都不会?没错,我开始也是这样的,网上找了一堆资料,全都是上面那样介绍的,什么左根右,什么左右根,啥玩意,怎么一会C下一步就跑到J上面去了?

没关系,我保证你看完下面的,绝对能轻松掌握先序、中序、后序遍历。随便给你你个二叉树,分分钟给它遍历咯。

来,我们先加上两个字,加完以后你就能理解一半了。

——递归

三种遍历都是从二叉树的根节点开始的。
三种遍历都是从二叉树的根节点开始的。
三种遍历都是从二叉树的根节点开始的。

没错,就是从根节点开始的。以中序遍历为例,我们来看看上图到底是怎么遍历的。还记得中序遍历的遍历规则么,先左、再根、后右。

开始啦!从根节点A开始,按顺序左根右,也就是‘BA空’,因为根节点A没有右的子节点嘛。也就是B在A的前面,那是不是中序遍历最开始就是B了呢?NO!!!还记得前面的递归二字么,到B之后递归就开始啦。此时以B为根节点,继续往下走,按中序遍历的规则——左根右,也就是CBG。看到没,C在B的前面,以C为根节点继续递归。那么啥时候递归结束了呢?当然就是递归不下去了就可以输出节点啦。这里以C为根节点,按顺序左根右就是‘空CD’了,已经没有节点可以排在C之前了,所以输出C,那既然按‘空CD’的顺序,那C后面是不是就是D了呢?NO!!!因为D也要往下走啊,以D为根节点那就是‘FDE’这样的顺序了。显然这里F和E已经到了叶节点了,不能再往下了,所以这一块的顺序就是CFDE了。E输出完了之后呢?之后是不是又懵逼了?还记得之前停在哪么?对,就是CBG,B是根节点,CDEF这四个当做一个整体,这个整体就看做是B的左子节点,左边输出完了,按顺序就到跟节点B啦,把B右侧所有的看成一个整体。接着就到了右了。
现在以G作为根节点,‘左根右’就是‘空GH’啦,H之后的都排在G之后,而G左边的没有了,所以这里要输出G。到这里我们已有CFDEBG了。后面都是同样的道理,H的下左边是I,I的下左边是J,没有什么能排在J之前了,所以输出J。
到这之后我就不细说了。最后就能得到CFDEBGJILMKHA。

总之,记住递归二字,还有就是将某节点之后的所有节点当做一个整体来看,差不多算是一棵子树吧。
看到这里,应该都能懂吧。大家可以以上图为例,进行一下后序遍历,就当是练习了。

已知中序遍历、后序遍历求先序遍历

最最经典的来啦,会这个不能说是理解二叉树了,但是不会这个一定不敢说自己理解二叉树。
已知中序遍历,先序遍历和后序遍历两者知其一,就能求出另一个了。
还是以上面的图为例吧,不,这次就当这个图不存在,我们已知:

中序遍历:CFDEBGJILMKHA
后序遍历:FEDCJMLKIHGBA

现在来求先序遍历。

别急,其实根本不难,理解之后就超级简单的。

先回忆下遍历规则:

中序遍历:先左、再根、后右
后续遍历:先左、再右、后根

好啦,开始啦。
1.先看后序遍历,先左、再右、后根,所以A一定是根节点,且是整棵树的根节点。这样A的位置就确定啦。
2.再在中序遍历序列中找到根节点A,我们知道中序遍历:先左、再根、后右。以根节点为中心,根节点左侧的当做一个整体,根节点右侧的也当做一个整体。这里的话CFDEBGJILMKH是一个整体,全部在A的左侧,而A的右侧没有元素,也就是没有右子树。
3.再回头看看后序遍历序列FEDCJMLKIHGBA,A是根节点且没有右子树,所以B一定就是A的左子树根节点啦。这样B的位置就确定了。
4.现在以B为根节点,在中序遍历序列中找到B的位置,B的左侧看成一个整体,CFDE全在B的左边。B的右侧看成一个整体,GJILMKH全在右边。我们先来看看左边的CFDE这几个是个啥结构?只盯着这几个是看不出来滴。在后序遍历里面找找这几个的相对位置,发现刚好在一起,顺序是FEDC。显然C是这四个元素的根节点。同样的,按之前的规律,在中序遍历序列中以根节点为中心,根节点两边的就是左右子树。发现C没有左子树,FDE都在右边。后序里面是FED所以D是这三个元素的根节点,F就是左子节点,E就是右子节点。

到这里能得到以下这个结果了(原谅我,我们灵魂画手都这样)
这里写图片描述

右边的那一部分我就不画了,怕辣到大家眼睛。总之,通过后序遍历和前序遍历都能找到根节点,通过中序遍历能分开左右子树,结合二者就能还原出二叉树了,自然就能通过二者求小三了。但是二者之中必须要有中序遍历。

以上,全文完。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章