p56 树t是否等于树s的子树 (leetcode 572)

一:解题思路

方法一:将s中的每一颗子树都和t进行对比。Time:O(m*n),Space:O(h)

方法二:将s和t的每颗子树的根节点都设置一个哈希值,于是只需要对比对于节点的哈希值就行。Time:O(m+n),Space:O(m+n)

二:完整代码示例 (C++版和Java版)

方法一C++:

class Solution {
public:
    bool isSame(TreeNode* s, TreeNode* t)
    {
        if (s == NULL && t == NULL) return true;
        if (s == NULL || t == NULL) return false;

        return (s->val==t->val) && 
            (isSame(s->left,t->left)) && (isSame(s->right,t->right));
    }

    bool isSubtree(TreeNode* s, TreeNode* t) 
    {
        if (t == NULL) return true;
        if (s == NULL) return false;

        return isSame(s, t) || isSubtree(s->left,t) || isSubtree(s->right,t);
    }
};

方法一Java:

class Solution {
    private boolean isSame(TreeNode s,TreeNode t)
    {
        if((s==null)&&(t==null)) return true;
        if(s==null||t==null) return false;
        
        return (s.val==t.val)&&
                (isSame(s.left,t.left))&&(isSame(s.right,t.right));
    }
    
    public boolean isSubtree(TreeNode s, TreeNode t) 
    {
          if(t==null) return true;
          if(s==null) return false;
          
          return (isSame(s,t))||(isSubtree(s.left,t))||(isSubtree(s.right,t));
    }
}

方法二C++:

暂时没写出来。

方法二Java:

class Solution {
    private Map<TreeNode,Integer> map=new HashMap<>();

    private String commuteHash(TreeNode t)
    {
        if(t==null) return "#";
        String left=commuteHash(t.left);
        String right=commuteHash(t.right);
        String hash=left+t.val+right;
        map.put(t,hash.hashCode());

        return hash;
    }

    private boolean isSub(TreeNode s,TreeNode t)
    {
        if(t==null) return true;
        if(s==null) return false;

        return map.get(s).equals(map.get(t))||isSub(s.left,t)||isSub(s.right,t);
    }

    public boolean isSubtree(TreeNode s, TreeNode t)
    {
          commuteHash(s);
          commuteHash(t);

          return isSub(s,t);
    }
}

 

上一篇:【树】572. 另一个树的子树


下一篇:leetcode:1282. 用户分组(贪心)