一,题目描述
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
示例1:
给定树s:
给定树t:
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
示例2:
给定树s:
给定树t:
返回false
二,代码实现
1,思路:(具体过程参考详细注释)
我们采用递归的思想解决这个问题:
首先我们得找到子树的根节点是否存在于另一颗树,如果不存在即不是子树
A:递归遍历树s,找到t根节点的位置,
B:再去调用递归方法判断s中以t根结点为根节点的树是否与t是同一棵树
2,代码
public boolean isSubTree(TreeNode s, TreeNode t){
if (t == null && s == null){//如果两颗树都为空树就是认为相等的(即为子树)
return true;
}
if (s == null || t == null){//如果其中一颗树为空,另一颗树不为空,即不可能为子树
return false;
}
boolean ret = false;
if (s.val == t.val){
//如果两棵树根节点值相同,则进一步看看是否为同一棵树
ret = isSameTree(s,t);
}
if (!ret){
//如果根节点不相同就递归看看左子树是否包含t
ret = isSubTree(s.left,t);
}
if (!ret) {
//如果左子树中没有就去左子树中找
ret = isSubTree(s.right,t);
}
return ret;
}
public boolean isSameTree(TreeNode root1, TreeNode root2){
if(root1 == null && root2 == null){ //如果两颗树都为空树就是认为相等的
return true;
}
if(root1 == null || root2 == null){ //如果其中一颗树为空,另一颗树不为空,即两棵树不相等
return false;
}
if(root1.val != root2.val){ //如果两棵树的对应根节点值不相同即为不同树
return false;
}
return isSameTree(root1.left,root2.left) && isSameTree(root1.right,root2.right);//递归判断根节点左右子树是否相同
}