子树结构
Tree 类问题另一个递归转迭代的思路就是,观察下递归是 pre-order, in-order 还是 post-order,然后对应的靠 stack 保存状态,模拟整个过程即可。
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == q) return true;
if(p == null || q == null) return false;
if(p.val != q.val) return false;
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}迭代写法,思路很简单,就是按照同一个顺序做 DFS (pre-order),每步上检查下元素值和 stack 大小就行,如果两个树一样,那么在迭代过程中所有的状态也都应该是一样的。
这个写法的子树访问路线以及顺序,和递归的写法是完全一样的。也就是说,其实这个迭代写法的思路,是完全建立在递归写法的代码上:
同样一题,用 stack 省空间的做法,其实和两个 queue 的思路基本完全一样。。
两种做法都是把树 traverse 了一遍,只不过顺序不同。有的时候我觉得,各种 tree 的 traversal,其实就像花式 for loop 一个 array 一样。
这题的双 stack 代码和 Same Tree 基本一样,只是 push 顺序不同而已。其代码的相似与不同可以追溯到各自的递归解法中,Tree 类问题递归结构是迭代写法的指引。
时间复杂度 O(n log n),一次检查 BST/getSize 为O(n),最多重复调用 O(log n) 次
自定义 SubtreeTuple 的写法:
时间复杂度 O(n),每个 node 只访问一次,没有重复递归调用。
对于 subtree 特征以及 flag 的处理上,和上一道题可以用完全一样的套路。
唯一的不同在于,我们要返回的是总数,而不是 max ,所以要左右加一起才行。
(G) 面经
Given a binary tree, find if there are two subtrees that are the same. (i.e. the tree structures are the same; the values on all corresponding nodes are the same). You should find the largest subtree and don’t use brute force.
贴个 hx 的思路,仔细讨论和思考之后觉得靠谱。

按着这个思路试着写了一下,附带两个 test case,返回的是最大 subtree 的 size.
第一个 comment 掉的 test case 和图里的一样,返回 4 .
第二个是左右完全一样的 binary tree,中间缺一个 leaf node,返回 6.
Last updated