力扣572(另一棵树的子树)
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subtree-of-another-tree
解题思路
- 子树关系无非两种情况,一个是两棵树一模一样,那就是满足题意的两棵树;另外一种情况就是:一颗树的子树能够与作为儿子的树形成符合题意的情况。
- 具体到两棵树是否相同的判断,就可以参照力扣第100题(相同的树)一题,本题作者是基于那一题给出的解答
- 具体到一次迭代干了三件事:以根->左->右为序依次进行子树关系的判断;如果找寻至叶子节点都没有能匹配的上的情况,或者说“大树”和“小树”只要有一个根是null,那就没有题意说明的字面值也相同的情况。
class Solution {
private boolean isSameTree(TreeNode p,TreeNode q){
if(p==null&&q==null){
return true;//叶子都满足了,那当然是满足相同树的要求
}
if(p!=null&&q==null||p==null&&q!=null){
return false;//结构都一不一样,那当然是不一样的
}
//能走到这,说明p/q都不为null
if(p.val!=q.val){
return false;
}
return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);//根左右为序
}
public boolean isSubtree(TreeNode root, TreeNode subRoot) {
if(root==null||subRoot==null){
return false;//存在其中一个为空,显然不符合节点值相等的要求
}
//能走到这说明都不为null
//存在子树关系无非两种情况,两个树完全一样,或者一个树是另一个树的子树
if(isSameTree(root,subRoot)){
return true;
}
//能走到这,说明树至少是不相同的,接下来应该查看是否有子树的情况可实现
if(isSubtree(root.left,subRoot)){
return true;
}
if(isSubtree(root.right,subRoot)){
return true;
}
return false;
}
}
//每次迭代时:只要判断两件事:结构是否相等?结构相等时若字面值不相等,还是要继续以根左右为序继续往后找
//换句话说:每次迭代都是判断当前root和subRoot为根的两棵树是否相同,结构不同显然直接这个节点不用找了,结构相同说明还有机会