创建 / 序列化
[1]
/ \
[5] [4]
/ \ \
[2] [3] [6]
/
[7]对于任意指定子树,在 inorder / preorder / postorder 中都是长度一样的连续 subarray,只是位置不同。
同一题一个比较 pythonic 的解法甚至不需要像 java 一样定义区间
解决这题的关键就是,自己补位,构建一个 full binary tree 出来。
另外一个经验是,处理字符串的时候尽量直接用内置函数,比如 str.indexOf('x') 这种,知道题的重点不是字符串就别每次都手写了。
论坛上比较简洁正规的 pre-order DFS 递归写法:
这个写法里会在 queue 里放入 null.
核心思想是,用 # 补位,构造一个 "full binary tree",每个节点有 0 / 2 个子节点。因此在我们构造树的过程中,我们永远可以一次看两个元素,并且把子节点加入队列,保证算法的正确性。
在 Binary Tree 的各种遍历中,BFS 都是比较耗费空间的一种,所以一个显然的优化与 follow up 就是,能不能用 DFS ,迭代做。
去论坛看了一圈,发现对于 full binary tree,pre-order 和 in-order 的 DFS 都行,挺有意思的~
这种做法其实就是一种对 pre-order DFS 做法的 Stack 模拟。也是 Tree 类问题递归转迭代的常用手段。
另一种妖孽的写法是 dietpepsi 的 graph degree 思路,在这个帖子
这个思路可以验 pre-order 与 post-order 的 serialization.
最后一个思路是,借鉴这章之前 Serialization 的 pre-order 重建法,保存 doLeft 的 boolean 变量模拟重建树的过程。当然,这里 stack 存的其实是一个 stack frame,而不再是具体 node,左右子树也不重要了。
Last updated