剑指 Offer 26 -- 树的子结构

该博客讨论了如何在给定的两棵二叉树中判断一棵树是否为另一棵树的子结构。通过递归实现,遍历A树的每个节点并检查是否存在与B树相同的结构和节点值。示例展示了不同输入下的判断结果,并提供了相应的Java代码实现。

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

剑指 Offer 26 – 树的子结构

题目:

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

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:

给定的树 A:

     3
    / \
   4   5
  / \
 1   2
给定的树 B:

   4 
  /
 1
返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。

示例 1:

输入:A = [1,2,3], B = [3,1]
输出:false

示例 2:

输入:A = [3,4,5,1,2], B = [4,1]
输出:true

限制:

0 <= 节点个数 <= 10000

代码:

package com.xujinshan.offer.offer26;

/**
 * @Author: xujinshan361@163.com
 * 剑指 Offer 26 -- 树的子结构
 * 输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)
 * <p>
 * B是A的子结构, 即 A中有出现和B相同的结构和节点值。
 * <p>
 * 例如:
 * 给定的树 A:
 * <p>
 * 3
 * / \
 * 4   5
 * / \
 * 1   2
 * 给定的树 B:
 * <p>
 * 4
 * /
 * 1
 * 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。
 * <p>
 * 示例 1:
 * <p>
 * 输入:A = [1,2,3], B = [3,1]
 * 输出:false
 * <p>
 * 示例 2:
 * <p>
 * 输入:A = [3,4,5,1,2], B = [4,1]
 * 输出:true
 * <p>
 * 限制:
 * <p>
 * 0 <= 节点个数 <= 10000
 */

import com.sun.source.tree.Tree;

/**
 * Definition for a binary tree node.
 */
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

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

    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}

class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        return (A != null && B != null) && (recur(A, B) || isSubStructure(A.left, B) || isSubStructure(A.right, B));
    }

    private boolean recur(TreeNode A, TreeNode B) {
        // 表示B没有节点了
        if (B == null) {
            return true;
        }
        // 表示A 没有节点了,或者值不相同的时候
        if (A == null || A.val != B.val) {
            return false;
        }
        return recur(A.left, B.left) && recur(A.right, B.right);
    }
}

public class Offer26 {
    public static void main(String[] args) {
        TreeNode B = new TreeNode(4, new TreeNode(1), new TreeNode(2));
        TreeNode A = new TreeNode(3, B, new TreeNode(5));
        System.out.println(new Solution().isSubStructure(A, B));
    }
}

结果:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值