You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
python/TangDou/AcWing/DP/Section/二叉树的三种遍历方式.md

4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

二叉树的三种遍历方式

一、二叉树的前序、中序、后序遍历

二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。为啥叫这个名字?是根据根节点的顺序命名的。

规则:

  • 前中后序是对根而言的,前就是先说根是啥,中就是中间说根是啥,后是最后说根是啥。
  • 除根以外,其它同级节点的遍历顺序是先左后右。

举栗子: 比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点

  • 前序顺序是ABC
  • 中序顺序是BAC(先左后根最后右)
  • 后序顺序是BCA(先左后右最后根)

比如上图二叉树遍历结果

前序遍历:ABCDEFGHK

中序遍历:BDCAEHGKF

后序遍历:DCBHKGFEA

分析中序遍历如下图,中序比较重要

二、前序、中序、后序遍历知二求一

前序、中序、后序遍历知二求一是二叉树中的必考点。为了能够发现规律,不用每次都费劲地推算,特整理如下:

首先回顾一下三种遍历的特点:

前序遍历:根左右 中序遍历:左根右 后序遍历:左右根

Q1:已知前序、中序遍历,求后序遍历

【分析】: 前序HGEDBFCA 中序EGBDHFAC

1、根据前序序列的特点根左右可知H是整个树的根。 至此作为选择题而言已经可以选出正确答案B了。但我们的目标是求出后序序列

2、根据中序序列的特点左根右可知EGBD位于树的左子树FAC位于树的右子树。

3、又因为前序序列的特点可知树根后面紧接着的应当是左子树的树根。所以G是左子树的树根。

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步得到最终结果

后序序列为:EBDGACFH

总结

  • 前序的第一个是整个树的根
  • 后序的最后一个是整个树的根
  • 中序用来判别左右子树的划分
  • 前序序列中左子树部分的第一个节点是左子树的根节点
  • 前序序列中右子树部分的第一个节点是右子树的根节点

Q2:为什么已知前序、后序无法求中序?

证明一件事是对的很难,证明一件事是错的很简单,比如,举个栗子说明它不对就完了。

如下前序 ab 后序ba

   a   或者  a
  /           \ 
 b             b

中序是ba 或者ab所以是不知道中序的。