• 剑指 Offer 26. 树的子结构


    题目

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

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

    例如:
    给定的树 A:
    在这里插入图片描述
    给定的树 B:
    在这里插入图片描述

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

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

    示例 2:

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

    题解

    判断树 B是否是树 A的子结构,需完成以下两步工作:

    先序遍历树 A中的每个节点nA;(对应函数 isSubStructure(A, B))
    判断树 A中 以nA为根节点的子树是否包含树 B 。(对应函数isSub( A, B))

    在这里插入图片描述
    2 .调用函数isSub(A,B),判定树A包含树B
    案例
    在这里插入图片描述

    isSub(A,B)函数:
    终止条件:

    当节点 B(树B的根节)为空:说明树 B已匹配完成(越过叶子节点),因此返回 true;
    当节点 A(树A的根节点)为空:说明已经越过树 A叶子节点,即匹配失败,返回 false;
    当节点 A和 B的值不同:说明匹配失败,返回 false;

    返回值:

    判断 A和 B的左子节点是否相等,即 isSub(A.left, B.left) ;
    判断 A和 B的右子节点是否相等,即 isSub(A.right, B.right) ;

    isSubStructure(A, B) 函数:
    特例处理:

    当 树 A为空 或 树 B为空 时,直接返回 false;

    返回值:

    若树 B是树 A的子结构,则必满足以下三种情况之一,因此用或 || 连接;

    以节点 A 为根节点的子树包含树 B,对应isSub(A, B);
    树 B 是 树 A 左子树 的子结构,对应 isSubStructure(A.left, B);
    树 B 是 树 A 右子树 的子结构,对应 isSubStructure(A.right, B);
    
    • 1
    • 2
    • 3

    代码

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
    		//遍历树A,先访问到节点
        public boolean isSubStructure(TreeNode A, TreeNode B) {
        //一开始如果A或者B为空,直接返回false
        //因为题目约定空树不是任意一个树的子结构
        if(A==null||B==null)
            return false; 
        //接下来去以下几种情况
        //A 的根节点VS B的根节点(A 的左右子树的节点VS B的根节点)
            //1、A 的根节点和B的根节点相同情况,依次比较它们的子节点
            // 2、A 的根节点和B的根节点不相同情况,A的左子树 VS B的根节点
            // 3、A 的根节点和B的根节点不相同情况,A 的右子树 VS B的根节点
            return isSub(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);
        }
    
    	//判断树A包含树B
         boolean isSub( TreeNode A, TreeNode B){
            //A和B不匹配的情况有很多,我们需要一开始去找它们完全匹配的情况
            //即遍历完B,直到为null,说明B的全部节点都和A 的子结构匹配上
            if(B==null)
                return  true; 
            // A中的节点为空,但B中的节点不为空,说明不匹配
            if(A==null)
                return false;
            // A和B都不为空,但数值不同,说明不匹配
            if(A.val!=B.val){
                return false;
            }
            //此时,当前这个点是匹配的,继续递归判断左子树和右子树是否「分别匹配J
            return isSub(A.left,B.left)&&isSub(A.right,B.right);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    go slice使用
    Win10 update version 22H2
    部分背包问题细节(贪心)
    css中只使用vue的变量
    苹果手机备份软件哪个好用?有哪些免费的第三方备份软件
    c++ 二分查找
    vue 实现下载pdf格式的文件
    Dijkstral算法优化及经典递归题目
    Redis单机版搭建
    java计算机毕业设计销售人员绩效管理系统源码+系统+数据库+lw文档(1)
  • 原文地址:https://blog.csdn.net/weixin_45122172/article/details/125416658