力扣572(另一棵树的子树)

力扣572(另一棵树的子树)

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subtree-of-another-tree

解题思路

  1. 子树关系无非两种情况,一个是两棵树一模一样,那就是满足题意的两棵树;另外一种情况就是:一颗树的子树能够与作为儿子的树形成符合题意的情况。
  2. 具体到两棵树是否相同的判断,就可以参照力扣第100题(相同的树)一题,本题作者是基于那一题给出的解答
  3. 具体到一次迭代干了三件事:以根->左->右为序依次进行子树关系的判断;如果找寻至叶子节点都没有能匹配的上的情况,或者说“大树”和“小树”只要有一个根是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为根的两棵树是否相同,结构不同显然直接这个节点不用找了,结构相同说明还有机会
上一篇:Beta阶段冲刺前的准备


下一篇:2021-11-26 力扣 222,110,257,100,572