572. 另一个树的子树

173 阅读1分钟

题目描述

image.png

思路

  • 先递归1找t的root在s中值相同的节点root2
  • 递归2判断root和root2是不是相同的树
    • 如果不是,递归1往下判断。

代码

//注意和剑指26的区别
class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if (root == null) { //没找到一个root能匹配
            return false;
        }
        if (root.val == subRoot.val && isSame(root, subRoot)) {
            return true;
        } else { // 往下从root的子树中找匹配
            return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
        }
        // 下面这种写法,[1,1] [1]会false
        // if (root.val != subRoot.val) {
        //     return isSubtree(root.left, subRoot) || isSubtree(root.right, subRoot);
        // } else {
        //     return isSame(root, subRoot);
        // }
    }
    //判断两棵树是否相同
    public boolean isSame(TreeNode root, TreeNode subRoot) {
        if (root == null && subRoot == null) {
            return true;
        } 
        if (root == null || subRoot == null) {
            return false;
        }
        if (root.val == subRoot.val) {
            return isSame(root.left, subRoot.left)
                && isSame(root.right, subRoot.right);
        } else {
            return false;
        }
    }
}