树 --- leedcode 572 子树 (Easy)

题目

给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。
s 的一个子树包括 s 的一个节点和这个节点的所有子孙。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

解析

思路: 双重递归

  • 对每一个节点当作根节点都进行一次dfs,遍历看是否有子树

java代码:

class Solution {
    public boolean isSubtree(TreeNode s, TreeNode t) {
        if(s == null ) return false; 
        return dfs(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
    }
    private boolean dfs( TreeNode s, TreeNode t) {
        // 如果是s,t都为空,返回true
        if(s == null && t == null) return true;
        // 如果其中一个为空,另一个不为空,返回false
        if(s == null ||  t == null) return false;
        if(s.val != t.val)  return false;
        return dfs(s.left, t.left) && dfs(s.right, t.right);
    }
}

js代码:

var isSubtree = function(s, t) {
    if(s == null) return false;
    return dfs(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t) ;
    function dfs (s, t) {
        if(s == null && t == null) return true;
        if(s == null || t == null) return false;
        if(s.val != t.val) return false;
        return dfs(s.left, t.left) && dfs(s.right, t.right);
    }
};

你可能感兴趣的:(#,树)