5.10
这个题一直找不到哪里出错误了。
我的思路是,先遍历子树,找到相同的根节点,然后再对比左子树右子树。
问题出在这个函数中
public boolean isSubtree1(TreeNode a, TreeNode b){
if(b == null && a == null){
return true;
}
if(a == null || b == null){
return false;
}
if(a.val == b.val){
return isSubtree1(a.right,b.right) && isSubtree1(a.left,b.left);
}
return false;
}我最初写的是,
public boolean isSubtree1(TreeNode a, TreeNode b){
if(b == null){
return true;
}
if(a == null){
return false;
}
if(a.val == b.val){
return isSubtree1(a.right,b.right) && isSubtree1(a.left,b.left);
}
return false;
}这样是不对的。因为当a 和 b 中有一个为空,而另一个不为空时,就应该返回false。
正确的AC代码如下:
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param T1, T2: The roots of binary tree.
* @return: True if T2 is a subtree of T1, or false.
*/
public boolean isSubtree1(TreeNode a, TreeNode b){
if(b == null && a == null){
return true;
}
if(a == null || b == null){
return false;
}
if(a.val == b.val){
return isSubtree1(a.right,b.right) && isSubtree1(a.left,b.left);
}
return false;
}
public boolean isSubtree(TreeNode T1, TreeNode T2) {
if(T2 == null){
return true;
}
if(T1 == null){
return false;
}
//先序遍历T1 找到和T2相同的点,开始对比
LinkedList<TreeNode> list = new LinkedList<TreeNode>();
TreeNode bt1 = T1;
while(bt1 != null || !list.isEmpty()){
while(bt1 != null){
if(bt1.val ==T2.val){
if(isSubtree1(bt1,T2)){
return true;
}
}
list.push(bt1);
bt1 = bt1.left;
}
if(!list.isEmpty()){
bt1 = list.pop();
bt1 = bt1.right;
}
}
return false;
}
}
1673

被折叠的 条评论
为什么被折叠?



