树与二叉树与森林

发布时间 2023-12-25 20:28:11作者: W_K_KAI

2、若将一棵树T转化为对应的二叉树BT,则下列对BT的遍历中,其遍历序列与T的后根遍历序列相同的是______。

A.先序遍历 B.中序遍历 C.后序遍历 D.按层遍历

解析:

在后根遍历(也称为后序遍历或后序遍历)中,对于T的每个节点,首先遍历其左子树,然后遍历其右子树,最后访问该节点本身。

而在中根遍历(也称为中序遍历)中,对于BT的每个节点,首先遍历其左子树,然后访问该节点本身,最后遍历其右子树。

由于将T转化为BT时会保持T的左子树和右子树的相对位置不变,所以T的后根遍历序列会对应BT的中根遍历序列。

因此,对BT进行中根遍历将得到与T的后根遍历序列相同的结果。

所以选择B。

什么是树?

摘录于:#图解 数据结构:树和森林与二叉树的相互转换 - 知乎 (zhihu.com)

树(Tree)是一种非线性的数据结构。

树是n(n≥0)个节点的有限集。n=0时,称为空树。

树由唯一的根和若干棵互不相交的子树组成。

img

一棵树

每一棵子树又是一棵树,也是由唯一的根节点和若干棵不相交的子树组成的。

img

子树

img

树的定义是递归的

我们可以发现,树的定义是递归。大可以无限套娃!

什么是森林?

很容易想到,由树组成森林。

专业一点的定义是:若干棵互不相交的树的集合

img

森林

什么是二叉树?

img

理解了树,稍加限制条件就是二叉树了。

二叉树就是有限制条件的树。

限制条件有二:

img

什么是度就不用我讲了吧。我还是讲吧,一句话带过。

节点的度:节点拥有的子树个数或者分支的个数。

在此,我们不妨看看二叉树的节点。

img

二叉树的节点


下面我们要用的是左孩子右兄弟的方法,

简单三步就能将树和二叉树相互转换。

树 -> 二叉树

img

一颗普通的树

1.加线。在所有的兄弟结点之间加一条线。

动图

加线

2.去线。树中的每个结点,只保留它与第一个孩子结点的连线,删除其他孩子结点之间的连线。

动图

去线

3.调整。以树的根结点为轴心,将整个树调节一下(第一个孩子是结点的左孩子,兄弟转过来的孩子是结点的右孩子)

动图

调整

所以最终结果为:

img

树转二叉树

二叉树 -> 树

知道了树转换为二叉树,那么二叉树转换为树就是个逆过程呗。

1.调整。将二叉树从左上到右下分为若干层。然后调整成水平方向。

动图

调整

2.加线。找到每一层节点在其上一层的父节点,加线。

动图

加线

3.去线。去除兄弟节点之间的连线。

动图

所以最终结果为:

img

二叉树转为树

二叉树 -> 森林

在此我需要再次强调的是,根据孩子兄弟表示法,根节点是没有兄弟的

前提:加入一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则转换为一棵树。

img

1.删除右孩子连线。

从根节点开始,若右孩子存在,则把与右孩子结点的连线删除。再查看分离后的二叉树,若其根节点的右孩子存在,则连续删除。直到所有这些根结点与右孩子的连线都删除为止。

动图

2.将每棵分离后的二叉树转换为树

动图

二叉树转换为树

所以最终结果为:

img

二叉树->森林

Nice!Nice!Nice!

搞定!