剑指offer26|树的子结构

113 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

输入两棵二叉树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

二、思路分析

  1. 递归终止条件:一、节点B为空,B匹配完成,返回true 二、节点A为空,返回false 三节点A与B的值不同,返回False
  2. 递归判断:lsame判断A的左节点和B的右节点是否相同,rsame判断A的右节点和B的右节点是否相同。
  3. 主函数确保AB同时不为nil才可以,递归遍历,判断A和B是否相同 ,判断A的左子树和B是否相同,判断A的右子树和B是否相同,如果有一个相同则判定合适。

三、AC 代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSubStructure(A *TreeNode, B *TreeNode) bool {
    return (A != nil && B != nil) && (sameTree(A,B) || isSubStructure(A.Left,B) || isSubStructure(A.Right,B))
}
//判断两个节点是否相同
func sameTree(A *TreeNode,B *TreeNode) bool {
    if B == nil {
        return true
    }
    if A == nil {
        return false
    }
    if A.Val != B.Val {
        return false
    }
    lsame := sameTree(A.Left,B.Left)
    rsame := sameTree(A.Right,B.Right)
    return lsame && rsame
}

四、总结

树的子结构需要注意的点是,当B为nil时,代表B已经到子节点,返回true。并且主函数中药判断A,B是否相同,以及递归判断A.Left和B,以及A.Right和B,要进行双重递归。