Leetcode-572-另一个树的子树

Leetcode-572、另一个树的子树

题解1

错误解答

// 思路
// 1、以当前节点s,t比较/s.left和t比较/s.right和t比较/s和t.left比较/s和t.right比较
// 2、递归终止,两个不为空,比较值/一个为空,一个不为空/两个为空
class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        if (s == null && t == null) {
            return true;
        }
        if (s == null || t == null) {
            return false;
        }
        if (s.val == t.val) {
            return isSubtree(s.left, t.left) && isSubtree(s.right, t.right);
        } else {
            return isSubtree(s.left, t) || isSubtree(s.right, t) || isSubtree(s, t.left) || isSubtree(s, t.right);
        }
    }
}
badcase-1

树s


image.png

树t


image.png

结果
image.png
题解2

修正
题目为s是否包含t,而不是(s是否包含t,t是否包含s)

// 思路
// 1、以当前节点s,t比较/s.left和t比较/s.right和t比较
// 2、递归终止,两个不为空,比较值/一个为空,一个不为空/两个为空
class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        if (s == null && t == null) {
            return true;
        }
        if (s == null && t != null) {
            return false;
        }
        if (s != null && t == null) {    // 
            return false;
        }
        if (s.val == t.val) {
            return isSubtree(s.left, t.left) && isSubtree(s.right, t.right);
        } else {
            return isSubtree(s.left, t) || isSubtree(s.right, t);
        }
    }
}
badcase-2
image.png

但是修正之后的代码对于badcese-1判断正确,但是badcase-2不正确
分歧在于s!=null而t==null

好容易错的思路啊

// 思路
// 逻辑1:是否是子树,是否包含的关系
// 逻辑2:是否相同
class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        if (s == null && t == null) {
            return true;
        }
        if (s != null && t == null) {
            return false;
        }
        if (s == null && t != null) {
            return false;
        }
        if (s.val == t.val) {
            return isSametree(s.left, t.left) && isSametree(s.right, t.right);
        } else {
            return isSubtree(s.left, t) || isSubtree(s.right, t);
        }
    }
    private boolean isSametree(TreeNode s, TreeNode t) {
        if (s == null && t == null) {
            return true;
        }
        if (s == null || t == null) {
            return false;
        }
        if (s.val != t.val) {
            return false;
        }
        return isSametree(s.left, t.left) && isSametree(s.right, t.right);
    }
}
正确题解

注意1: 两种逻辑,包含关系、相等关系的不同之处
注意2: if-else之处

// 思路
// 逻辑1:是否是子树,是否包含的关系, s为空时,一定为false,t为空时,一定为true
// 逻辑2:是否相同,s不为空、t为空时,是false(与逻辑1不同)
class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        // 注意1,包含关系和相等关系的不同之处,s不为空、t为空时
        if (t == null) {
            return true;
        }
        if (s == null) {
            return false;
        }
        // 注意2:不是if-else的关系
        // if (s.val == t.val) {
        //     return isSametree(s.left, t.left) && isSametree(s.right, t.right);
        // } else {
        //     return isSubtree(s.left, t) || isSubtree(s.right, t);
        // }
        // 实现1
        // boolean res = false;
        // if (s.val == t.val) {
        //     res = isSametree(s.left, t.left) && isSametree(s.right, t.right);
        // } 
        // return res || isSubtree(s.left, t) || isSubtree(s.right, t);
        // 实现2
        return isSametree(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
    }
    private boolean isSametree(TreeNode s, TreeNode t) {
        if (s == null && t == null) {
            return true;
        }
        if (s == null || t == null) {
            return false;
        }
        if (s.val != t.val) {
            return false;
        }
        return isSametree(s.left, t.left) && isSametree(s.right, t.right);
    }
}

https://leetcode-cn.com/problems/subtree-of-another-tree/solution/dui-cheng-mei-pan-duan-zi-shu-vs-pan-duan-xiang-de/

关于细节

探讨包含关系和相等关系的不同之处
实现1、实现2、实现3都可以正确通过,其实题目交代了s和t都为非空,所以isSubtree在递归过程中,s可能为空,但t不会为空。
不会出现以下情况:
1、s == null && t == null
2、s != null && t == null
t一定是不为空的

class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        // 实现1
        // if (t == null) {
        //     return true;
        // }
        // if (s == null) {
        //     return false;
        // }
        // 实现2
        // if (s == null && t == null) {
        //     return true;
        // }
        // if (s == null && t != null) {
        //     return false;
        // }
        // if (s != null && t == null) {     // ??? true或者false都是可以通过的
        //     return false;
        // }
        // 实现3
        if (s == null && t != null) {
            return false;
        }
        return isSametree(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
    }
    private boolean isSametree(TreeNode s, TreeNode t) {
        if (s == null && t == null) {
            return true;
        }
        if (s == null || t == null) {
            return false;
        }
        if (s.val != t.val) {
            return false;
        }
        return isSametree(s.left, t.left) && isSametree(s.right, t.right);
    }
}

你可能感兴趣的:(Leetcode-572-另一个树的子树)