Binary Tree Traversal I Depth First Search

Tree Traversal

Part I: DFS Recursion实现

  • 注意这颗特别的树

DFS遍历的本质(核心要点)

注意走三次,pre,in,post,第几次回就是对应的,i.e.

DFS遍历的本质(核心要点)

  • 一笔画走完每一个分支,每个其实会经过三次,

    • 第一次经过,就是DFS preOrder

      • 也是从你的parent call的时候,从上到下的过程

    • 第二次经过,就是DFS inOrder

      • 从你的左子树回来的时候经过你的过程,从下到上的过程

    • 第三次经过,就是DFS postOrder

      • 从你的右子树回来的时候最后一次经过你的时候(马上下一站该会parent):从下到上的过程

Part II: DFS Iteration 实现

版本1(可以给preOrder & inOrder)

  • 经过这个概念,第几次经过,第一次,第二次都好,但是第三次不行

  • 我们总是在第二次经过的时候就给他pop出来,然后我们就没有机会第三次cur赋予为这个node

版本2(错误)

  • 问题更大,不是不好表达,根本就是错误,这个while循环可能进不去么?单反是有一个点进去了,全程没有pop

  • 第一次,第二次都没有问题,第三次本来就应该是pop出来,第三次也peek了,第四次,第五次。。。。

  • 根本问题在于:所以第二次和第三次经过的本质区别是啥?

    • 第二次和第三次经过这个点他们的本质区别在哪?方向不同?第二次经过他是从左子树回来,而第三次经过它是从右子树回来

    • 所以可以用prevNode,知道上一次访问的(visit)的node如果是左子树的根节点,那我一定是第二次经过你啊我是从你左边回来的,如果我上一次访问的(visit)的node如果是右子树的根节点,那我一定是第三次是经过你了因为我是从你的右边回来的

版本3 加个lastVisited(可以给postOrder)

  • 如果我只是想写post order,其实我不需要知道我是第几次经过这个点,而我更需要知道的是我从哪个点访问完以后才来经过当前点的,看从左还是从右回来就可以了

版本4 自己数啥时候经过

count:就是第几次经过

Last updated