245 - 子树

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;
    }
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值