给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
简单难度。这道题和剑指 Offer 26. 树的子结构比较相似,采用双递归即可解决。三种情况,要么root等于subRoot,要么root的左子树等于subRoot,要么root的右子树等于subRoot。只要满足一个要求即可返回true,等价于前序遍历。
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if (root == null) {
return false;
}
//要么root等于subRoot,要么root的左子树等于subRoot,要么root的右子树等于subRoot
//只要满足一个要求即可返回true,等价于前序遍历。
return dfs(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
}
private boolean dfs(TreeNode root, TreeNode subRoot) {
if (root == null && subRoot == null) {
return true;
}
if (root == null || subRoot == null || root.val != subRoot.val) {
return false;
}
return dfs(root.left, subRoot.left) && dfs(root.right, subRoot.right);
}