另一棵树的子树
2024年8月4日约 294 字小于 1 分钟
另一棵树的子树
题意
给你两棵二叉树 root
和 subRoot
。检验 root
中是否包含和 subRoot
具有相同结构和节点值的子树。如果存在,返回 true
;否则,返回 false
。
二叉树 tree
的一棵子树包括 tree
的某个节点和这个节点的所有后代节点。tree
也可以看做它自身的一棵子树。
思路一
直接递归判断:
- 如果
subRoot
为空,则和叶节点的空子节点匹配,返回true
- 如果当前节点是空节点,无法与
subRoot
匹配,返回false。
- 如果当前节点与
subRoot
根节点相同,则递归往下判断,如果是相同的树,返回true。
- 否则,递归左右子树,看是否能找到匹配的,如果找到则返回
true
。
代码:
class Solution {
boolean isSametree(TreeNode p, TreeNode q) {
if (p == null || q == null) return p == q;
return p.val == q.val
&& isSametree(p.left, q.left)
&& isSametree(p.right, q.right);
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if (subRoot == null) return true;
if (root == null) return false;
return isSametree(root, subRoot)
|| isSubtree(root.left, subRoot)
|| isSubtree(root.right, subRoot);
}
}
思路二(优化)
只在高度相同时匹配