《剑指Offer》(26)树的子结构

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

要查找树A中是否存在和树B结构一样的子树,可以分为2步来考虑:第一步,对树A进行层序遍历,在树A中找到和树B中的根结点的值相等的结点N;第二步,如果在树A中找到了和树B中的根结点的值相等的结点N,则继续判断树A中以结点N为根结点的子树是否包含和树B一样的结构,即判断树A中以结点N为根节点的左子结点的值和右子结点的值是否分别与树B的左子结点的值和右子结点的值相等。
涉及二叉树的遍历(层序遍历:从上到下,同一层从左到右),最常用的方法就是递归和循环,考虑到递归的代码比较简练,因此这里使用递归的方法去遍历二叉树。
同时,因为二叉树的问题常常涉及到比较复杂的指针操作,因此要非常注意对于指针为null的情况的判断和处理,因为当代码试图访问空指针指向的内存时,程序就会崩溃。在写遍历树的代码的时候一定要高度警惕,在每一处需要访问地址的时候都要问自己这个地址有没有可能是null,如果是null的话该怎么处理。

/*
public class TreeNode 
{
    int val = 0;//根结点的值
    TreeNode left = null;//左子结点
    TreeNode right = null;//右子结点
    public TreeNode(int val)//构造函数 
    {
        this.val = val;//this关键字用于区分成员变量和局部变量同名的情况
    }
}
*/
public class Solution 
{
    public boolean HasSubtree(TreeNode root1,TreeNode root2) 
    {
        boolean result = false;
        //找到树A中与树B根结点的值相同的结点N
        if(root1 != null && root2 != null)
        {
            if(root1.val == root2.val)
                result = isSubTree(root1,root2);
            if(!result)
                result = HasSubtree(root1.left,root2); 
            if(!result)
                result = HasSubtree(root1.right,root2); 
        }
        return result;
    }
    public boolean isSubTree(TreeNode root1,TreeNode root2)
    {
        if(root2 == null)//说明此时已经到了树B的叶子结点
            return true;
        if(root1 == null)//说明此时已经到了树A的叶子结点但没有到树B的叶子结点
            return false;
        if(root1.val != root2.val)
            return false;
        return isSubTree(root1.left,root2.left) && isSubTree(root1.right,root2.right);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值