137:另一个树的子树
LeetCode 572 https://leetcode.cn/problems/subtree-of-another-tree/description/ 难度:简单 高频面试题汇总:https://www.yuweihung.com/posts/2025/lc-hot/ 如果暴力匹配,时间复杂度是 O(n⋅min(n,m)),如何改进呢? 定义节点 node 的高度为 node 到其最深叶子的路径上的节点个数。特别地,叶子的高度为 1。设 subRoot 的高度为 hs。 设 node 为 root 中的节点。我们可以在匹配之前,先判断 node 的高度是否等于 hs,只有在相等时才做匹配。 这样做的时间复杂度是多少呢? 首先,对于 root 中的两个高度相同的节点 p 和 q(p =q),不可能出现 p 是 q 的祖先,或者 q 是 p 的祖先。因为如果 p 是 q 的祖先,那么 p 的高度必然大于 q 的高度,反之亦然。 其次,对于 root 中的两个高度相同的节点 p 和 q(p != q),子树 p 和子树 q 没有任何交集。假如有交集,说明从 p 出发可以到达某个点 node,从 q 出发也可以到达 node,但这只有在 p 是 q 的祖先,或者 q 是 p 的祖先时才成立,与两个节点高度相同矛盾。 所以,root 中的所有与 hs 高度相同的节点,对应的子树两两不相交,这些子树的节点个数之和不超过 n,所以总的匹配次数也不会超过 n,下面代码中的 dfs 的时间复杂度为 O(n)。 时间复杂度:O(n+m),其中 n 是二叉树 root 的节点个数,m 是二叉树 subRoot 的节点个数。注意当 subRoot 的节点个数比 n 还要多时,dfs 并不会遍历 subRoot 中的所有节点。其中 O(m) 是计算 subRoot 树高的时间,如果限制 getHeight 递归访问的节点个数至多为 n,则可以做到 O(n) 的时间复杂度。 空间复杂度:O(n+m)。如果限制 getHeight 递归访问的节点个数至多为 n,则可以做到 O(n) 的(栈)空间复杂度。 ...