树的子结构

题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

思路:第一感觉又要用递归了,如果不用递归思路,也可以解决,但是写起来比较麻烦,我也不打算那样子写,本题用了递归,也有很多细节需要注意。代码思路大概如下:

  • 首先判断a,b是否为空,当a,b不管谁为空,都不可能存在子结构。
  • 当第一个根节点相同时,判断b是否a子结构,这里需要编写一个函数,从该点开始,判断b是否a的子树(我可能描述不清楚,但是看了代码就很容易理解了)。
  • 如果第一个节点不相同。分别将a的左子树和右子树代入这个函数。这样一直递归下去。(emmm,看代码,其实递归思路很简单)。

代码:

java

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/

public class Solution {
        public boolean issametree(TreeNode pRoot1, TreeNode pRoot2){
    if(pRoot2==null)
        return true;
    if(pRoot1==null)//注意以上两个if不能顺序打乱
        return false;
    if(pRoot1.val!=pRoot2.val)
        return false;
         return issametree(pRoot1.left, pRoot2.left)&&issametree(pRoot1.right, pRoot2.right);
}
    public boolean HasSubtree(TreeNode pRoot1,TreeNode pRoot2) {
       
 
    if(pRoot2==null)
        return false;
    if(pRoot1==null)
        return false;
    boolean flag=false;//易错,这里一定要定义为false,因为后面if(flag==false)。假如初始化为true, 并且树的第一个元素不相等,不那么也不会执行仔细那一步的判断了。
    if(pRoot1.val==pRoot2.val){
        flag=issametree(pRoot1,pRoot2);
    }
        if(flag==false){
        flag=(HasSubtree(pRoot1.right, pRoot2)||HasSubtree(pRoot1.left, pRoot2));
    }
    return flag;
    // write code here
 
    }
}

js:  

/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function issametree(pRoot1, pRoot2){
    if(pRoot2==null)
        return true;
    if(pRoot1==null)//注意以上两个if不能顺序打乱
        return false;
    if(pRoot1.val!=pRoot2.val)
        return false;
         return issametree(pRoot1.left, pRoot2.left)&&issametree(pRoot1.right, pRoot2.right);
}
    function HasSubtree( pRoot1,pRoot2) {
    if(pRoot2==null)
        return false;
    if(pRoot1==null)
        return false;
    var flag=false;//易错,这里一定要定义为false,因为后面if(flag==false)。假如初始化为true, 并且树的第一个元素不相等,不那么也不会执行仔细那一步的判断了。
    if(pRoot1.val==pRoot2.val){
        flag=issametree(pRoot1,pRoot2);
    }
        if(flag==false){
        flag=(HasSubtree(pRoot1.right, pRoot2)||HasSubtree(pRoot1.left, pRoot2));
    }
    return flag;
    }

注意:代码中注释的容易出错,这个题,本来一下子就可以敲好,但是我很多细节忽略了,调试了2个多小时。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值