[路飞]_我对二叉树前序遍历/中序遍历/后序遍历的理论理解

213 阅读2分钟

不同于单链表,每个节点只存在于一个链表中。二叉树中的每一个节点(除了根),都存在于多个链表中。越到叶子节点,节点所属的链表数越多。有多少个叶子节点,这个树中就有多少条链表(通用的说,对于n叉树,n叉树中的每个节点,都可以在自己这个节点上建n个链表。)

针对二叉树这种,在每个节点上只允许建两条链表的树,我们可以说,左节点代表的是左链表,右节点代表的是右链表。二叉树的DFS递归,也是递归链表的升级版,在每个节点的左链表递归的回归阶段新增了递归右链表的逻辑。这样,每个节点要等左右链表都回归了,自己才向上回归。(Ps:通用的说,如果是n叉树,那么每一个节点的DFS函数执行中都会等n次的子链表回归,自己才回归)

对于二叉树的DFS,我们每处理一个节点,都要执行一次DFS函数。执行一次DFS函数的过程中,会离开两次这个DFS函数:

  • 第一次离开,去递归当前节点的左节点
  • 第二次离开,去递归当前节点的右节点。

因此,执行一次DFS函数,被切割成三部分代码片段:

  • A片段:从函数开始,到递归左节点前(开始过程)
  • B片段:从递归左节点后,到递归右节点前(第一次回归过程)
  • C片段:从递归右节点后,到函数结束(第二次回归过程)

换句话说,在遍历二叉树的过程中,每个节点都会被经过3次。具体地说是:递推的时候,经过一次。左链表回归上来的时候,经过一次。右链表回归上来的时候,经过一次,然后就返回父节点的DFS函数了。(Ps:通用的说,如果是n叉树,每个节点都会被经过 1+n 次)

综上:

  • 如果每次递推到某节点的时候,立马打印该节点值,就是前序遍历
  • 如果每次左子节点回归了,立马打印父节点值,就是中序遍历
  • 如果每次在某节点可以回归前,打印该节点值,就是后序遍历

Ps:兄弟节点间没有递归(调用)的关系,左节点不会调用右节点,右节点不会调用左节点。兄弟节点的关系,只有左兄先递推先回归,右兄后递推后回归。