572. 另一棵树的子树解题思路

142 阅读1分钟

题目地址:572. 另一棵树的子树

该题的本质其实就是对比两棵树是否相同,可以参考 100. 相同的树,所以基本的对比逻辑就已经定好了:

    public boolean isMatch(TreeNode p, TreeNode q) {
       if(p == null && q == null){
           return true;
       }
       if(p == null || q == null){
           return false;
       }
       return p.val == q.val && isMatch(p.left, q.left) && isMatch(p.right, q.right);
   }

需要注意的点就是如何去找子树? 思路如下:使用subRoot去进行匹配root,从root的根节点开始,然后依次递归root左子树、root右子树,直到将root遍历完毕。

    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root == null){
            return false;
        }
        return isMatch(root, subRoot) || isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot); 
    }

    private boolean isMatch(TreeNode root, TreeNode subRoot){
        // 两棵树同时为空,说明到底了
        if(root == null && subRoot == null){
            return true;
        }
        if(root == null || subRoot == null){
            return false;
        }
        return root.val == subRoot.val && isMatch(root.left, subRoot.left) && isMatch(root.right, subRoot.right); 
    }

解题要点:上述代码中,实际干活的实际就只有isMatch(root, subRoot)这个方法,递归调用isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot)的目的也是为了执行isMatch(root, subRoot),让subRoot可以和root中的每个子树可以做对比。