leetcode-572-另一个树的子树


本题是leetcode,地址:572. 另一个树的子树

题目

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

示例 1:
给定的树 s:

示例 1:
给定的树 s:
3
/
4 5
/
1 2
给定的树 t:

4
/
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。

示例 2:
给定的树 s:
3
/
4 5
/
1 2
/
0
给定的树 t:

4
/
1 2
返回 false。

分析

首先想一个问题,如果判断两个书是否相等?递归调用比较每一个节点的数值;

code如下

    public boolean isSameTree(TreeNode s, TreeNode t){
        // 如果两个节点都为空,可以认为相同
        if(s == null && t == null) return true;
        // 如果两个节点一个相同 其中一个是null,肯定不同
        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);
    }

如果有了比较两个树是否相同的判断函数,那么暴力解法就是枚举第一棵树的子树,就是深度遍历;

code如下:

   public boolean dfs(TreeNode s, TreeNode t) {
        if(t == null) return true;
        if(s == null) return false;
        return dfs(s.left,t) || dfs(s.right,t);
    }

如此一来,我们就可以写出完整代码:

code

    public boolean isSubtree(TreeNode s, TreeNode t) {
       return dfs(s,t);
    }

    public boolean dfs(TreeNode s, TreeNode t) {
        if(t == null) return true;
        if(s == null) return false;
        return dfs(s.left,t) || dfs(s.right,t) || isSameTree(s,t);
    }

    public 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);
    }

你的鼓励也是我创作的动力

打赏地址

posted @ 2020-07-19 16:28  Yangsc_o  阅读(178)  评论(0编辑  收藏  举报