题解
- 题意:给定两颗树的根节点,s,t,判断t所表示的树是不是s所表示的树的子树
- 题解:总共三种情况,要么s树等于t树,要么s树的左子树等于t树的左子树,要么s树的右子树等于t树的右子树,如果s树遍历完了都没找到t树重合的子树,那么说明没有
同样的实现,java递归效率为什么比C++高这么多?
- C++版本
class Solution {
public:
bool dfs(TreeNode* s, TreeNode* t){
if(!s && !t) return true;
if(!s || !t) return false;
if(s->val != t->val) return false;
return dfs(s->left, t->left) && dfs(s->right, t->right);
}
bool isSubtree(TreeNode* s, TreeNode* t) {
if(!t) return true;
if(!s) return false;
if(dfs(s,t)) return true;
return isSubtree(s->left, t) || isSubtree(s->right, t);
}
};
- java版本
class Solution {
public boolean helper(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 helper(s.left, t.left) && helper(s.right, t.right);
}
public boolean isSubtree(TreeNode s, TreeNode t) {
if(t==null) return true;
if(s==null) return false;
if(helper(s,t)) return true;
return isSubtree(s.left, t) || isSubtree(s.right, t);
}
}
题目