剑指offer面试题26:树的子结构(Java 实现)

本文介绍了一种算法,用于判断一棵二叉树B是否是另一棵二叉树A的子结构。首先,通过遍历A树找到与B树根节点相等的节点。若找到匹配节点,则进一步比较其子节点是否也匹配。文章详细解释了递归比较过程,并提供了特殊测试用例。
摘要由CSDN通过智能技术生成

题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
 
思路:
先通过遍历A树找到与B树根节点相等的节点(先拿A树的根节点比较,不匹配的话再利用递归思想拿A树根节点的左孩子和右孩子进行比较)。

如果B树的根节点和A树中所有节点都不匹配的话就直接返回 false;如果B树的根节点在A树中有匹配的话再调用另外一个函数来分别比较匹配后的根节点的左子树和右子树是否也都匹配,在这个函数中需要更多的考虑节点为空的情况。

测试用例:
1. 功能测试:树A和树B都是普通的二叉树;树B是或不是树A的子结构。
2. 特殊测试:两棵二叉树的一个或者两个根节点都为空;二叉树的所以子节点都没有左子树或者右子树。

public class test_twenty_six {
    public boolean HasSubtree(TreeNode root1, TreeNode root2){
        //设置默认的结果为false,如果一旦匹配result就设置为true
        //匹配不成功就返回默认的false
        boolean result = false;
        //需要两棵树都不会空才会进行判断,否则直接返回false
        if(root1 != null && root2 != null){
            //如果找到根节点匹配的节点,调用下面函数继续比较子节点是否也匹配
            if(root1.val == root2.val){
                result = doesTree1haveTree2(root1, root2);
            }
            //如果当前节点不匹配,分别遍历Tree1的左孩子和右孩子继续比较
            if(!result){
                result = HasSubtree(root1.left, root2);
            }
            if(!result){
                result = HasSubtree(root1.right, root2);
            }
        }
        return result;
    }

    public boolean doesTree1haveTree2(TreeNode node1, TreeNode node2){
        //如果Tree2遍历完了都能匹配上
        if(node2 ==null)return true;

        //如果Tree2没有匹配完,Tree1就先匹配完了,返回false
        if(node1 == null)return false;

        //如果有一个节点没有匹配上,返回false
        if(node1.val != node2.val)return false;

        //除去上述要考虑的特殊情况外,根节点匹配上了之后就分别匹配左孩子和右孩子
        return doesTree1haveTree2(node1.left, node2.left) && doesTree1haveTree2(node1.right, node2.right);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值