剑指Offer | 树的子结构
题目描述
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
B是A的子结构, 即 A中有出现和B相同的结构和节点值。
https://leetcode.cn/problems/shu-de-zi-jie-gou-lcof/
题解
首先要找到树 A 中节点值和树 B 的根节点值相等的节点,以该节点为根节点的子结构可能和树 B 相同。
先序遍历
对树 A 的每一个节点,我们都假设它可能是子结构的根节点,递归调用 isSubStructure()。同时对每一个假设,调用 recur 验证。
在 recur 的递归调用中,先判断当前节点值是否相同,如果相同,继续验证左子树,然后右子树,是先序遍历(根、左、右)。
这道题对遍历顺序没多大要求,不过先判根的话,如果根节点值不同,就可以剪枝了,&& 短路。
isSubStructure() 也是先序遍历,但是 || 短路,即找到答案就返回,不再找了。
1 | class Solution { |
时间复杂度 O(MN) :其中 M, N 分别为树 A 和 树 B 的节点数量;先序遍历树 A 是 O(M),每次调用 recur(A, B) 判断是 O(N) 。
空间复杂度 O(M):当树 A 和树 B 都退化为链表时,递归调用深度最大。
当 M ≤ N 时,遍历树 A 与递归判断的总递归深度为 M;当 M > N 时,最差情况为遍历至树 A 叶子节点,此时总递归深度为 M。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PEACE's Blog!










