剑指offer:树的子结构

本文探讨了如何通过深度优先搜索算法判断一棵二叉树是否是另一棵树的子结构,详细解析了递归遍历过程及子树比较的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

试题:
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
代码:
按照正常思维,我们都知道要一个个搜搜树的节点,每到一个节点,就和树B比较一次。因此
我们使用深度搜索来搜索树的每个节点。首先我们假设B和A都非null,这时我们可以写出递归遍历,因为每到下一个A节点,问题就又变成原始问题了。然后我们考虑递归终止条件,显然只要遍历到当前节点为null就可以返回了(该路径搜索完成,应该返回false)。那么该如何返回是个问题,因为我们只需要找到一个满足条件就可以返回,因此最终形式以||的关系。然后只需要把A或B等于null的边界条件加进去。
然后我们考虑如何比较子树,显然这又是个递归问题。只要当前节点值相等我们就可以继续比较下一节点,由于所有节点都要满足相等,所以以&&的形式返回。然后就是终止条件的考虑。当我们遍历到B的叶子节点时,当其为null,我们可以对当前路径返回true,如果不为null,则有两种可能性,要不可以继续比较,要不A下一节点为null了
BFS广度优先搜索 DFS深度优先搜索 回溯算法

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

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

    }

}
*/
public class Solution {
    private boolean isSubTree(TreeNode root1,TreeNode root2) {
        if(root2==null) return true;
        if(root1==null) return false;
        if(root1.val == root2.val){
            return isSubTree(root1.left,root2.left) && isSubTree(root1.right,root2.right);
        }else return false;
    }
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1==null || root2==null) return false;
        return isSubTree(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值