Files
python/TangDou/AcWing/DP/Section/二叉树的三种遍历方式.md
HuangHai 1f397eca87 'commit'
2025-08-30 18:35:01 +08:00

87 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 二叉树的三种遍历方式
### 一、二叉树的前序、中序、后序遍历
**二叉树遍历**分为三种:前序、中序、后序,其**中序遍历**最为重要。为啥叫这个名字?是根据根节点的顺序命名的。
<center><img src='https://img2022.cnblogs.com/blog/8562/202202/8562-20220211091038305-1247720841.png'></center>
<font color='red' size=4><b>规则:</b></font>
* 前中后序是对根而言的,前就是先说根是啥,中就是中间说根是啥,后是最后说根是啥。
* 除根以外,其它同级节点的遍历顺序是先左后右。
**举栗子:**
比如上图正常的一个满节点,$A$:根节点、$B$:左节点、$C$:右节点
* 前序顺序是$ABC$
* 中序顺序是$BAC$(先左后根最后右)
* 后序顺序是$BCA$(先左后右最后根)
<center><img src='https://img2022.cnblogs.com/blog/8562/202202/8562-20220211091205095-1495099739.png'></center>
比如上图二叉树遍历结果
前序遍历:$ABCDEFGHK$
中序遍历:$BDCAEHGKF$
后序遍历:$DCBHKGFEA$
分析中序遍历如下图,中序比较重要
<center><img src='https://img2022.cnblogs.com/blog/8562/202202/8562-20220211091304723-947800452.png'></center>
### 二、前序、中序、后序遍历知二求一
前序、中序、后序遍历知二求一是二叉树中的必考点。为了能够发现规律,不用每次都费劲地推算,特整理如下:
首先回顾一下三种遍历的特点:
>`前序遍历`:根左右
>`中序遍历`:左根右
>`后序遍历`:左右根
### $Q1$:已知前序、中序遍历,求后序遍历
<center><img src='https://img2020.cnblogs.com/blog/8562/202108/8562-20210802111731560-669872235.png'></center>
【分析】:
前序:HGEDBFCA
中序:EGBDHFAC
1、根据前序序列的特点(根左右),可知H是整个树的根。
(至此作为选择题而言,已经可以选出正确答案B了。但我们的目标是求出后序序列)
<center><img src='https://img2020.cnblogs.com/blog/8562/202108/8562-20210802111847358-592301611.png'></center>
2、根据中序序列的特点(左根右),可知,EGBD位于树的左子树,FAC位于树的右子树。
<center><img src='https://img2020.cnblogs.com/blog/8562/202108/8562-20210802111853859-1580206973.png'></center>
3、又因为前序序列的特点可知树根后面紧接着的应当是左子树的树根。所以G是左子树的树根。
<center><img src='https://img2020.cnblogs.com/blog/8562/202108/8562-20210802111935168-1285972441.png'></center>
4、由F是右子树在前序序列中出现的第一个,根据前序序列的特点(根左右),可知F是右子树的树根。
5、再对G重复2~4步:
5->2 G作为根时,中序序列G的左边是它的左子树,可知只有E一个节点。G右边到H之前的都是G的右子树。可知有B、D。
5->3 E作为G的叶子节点,无需判断左子树树根。
5->4 由D是G的右子树在前序序列中出现的第一个,根据前序序列的特点(根左右),可知D是G的右子树的树根。
6、由于中序序列中,B先于D出现,且D是根,所以B为D的左子树节点。
7、对F重复2~4步,得到最终结果:
<center><img src='https://img2020.cnblogs.com/blog/8562/202108/8562-20210802112014590-1313819305.png'></center>
后序序列为:EBDGACFH
<font color='red' size=4><b>总结</b></font>
* 前序的第一个是整个树的根
* 后序的最后一个是整个树的根
* 中序用来判别左右子树的划分
* 前序序列中左子树部分的第一个节点是左子树的根节点
* 前序序列中右子树部分的第一个节点是右子树的根节点
### $Q2:$为什么已知前序、后序无法求中序?
证明一件事是对的很难,证明一件事是错的很简单,比如,举个栗子说明它不对就完了。
如下前序 ab 后序ba
```
a 或者 a
/ \
b b
```
中序是ba 或者ab,所以是不知道中序的。