题目描述:
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
示例:
思路:先判断两棵树是否为空,若都为空,返回true,若只有一个为空,返回false,然后就判断subroot是否与root相同或者subroot是root的左子树或者是root的右子树,满足这三种的其中一种就返回true。
public class Num572 {
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root==null && subRoot==null){
return true;
}
if(root==null || subRoot==null){
return false;
}
//两棵树都不是空树,比较两棵树是否相同或者subroot是root的左子树或者subroot是root的右子树
return isSameTree(root,subRoot) || isSubtree(root.left,subRoot) || isSubtree(root.right,subRoot);
}
public boolean isSameTree(TreeNode p, TreeNode q) {
//如果两棵树都为空树
if(p==null && q==null){
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);
}
}