- Posted by 微博@Yangsc_o
- 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
本题是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);
}