一:解题思路
方法一:将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); } }