• 树-树的子结构


    树-树的子结构

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

    代码实现

    /**
     * Definition for a binary tree node.
     * type TreeNode struct {
     *     Val int
     *     Left *TreeNode
     *     Right *TreeNode
     * }
     */
    func isSubStructure(A *TreeNode, B *TreeNode) bool {
        if A == nil && B == nil {
            return true
        }
        if A == nil || B == nil{
            return false
        }
    
        var ret bool
    
        //当在 A 中找到 B 的根节点时,进入helper递归校验
        if A.Val == B.Val{
            ret = helper(A,B)
        }
    
        //ret == false,说明 B 的根节点不在当前 A 树顶中,进入 A 的左子树进行递归查找
        if !ret {
            ret = isSubStructure(A.Left,B)
        }
    
        //当 B 的根节点不在当前 A 树顶和左子树中,进入 A 的右子树进行递归查找
        if !ret {
            ret = isSubStructure(A.Right,B)
        }
        return ret
    
        //利用 || 的短路特性可写成
        //return helper(A,B) || isSubStructure(A.Left,B) || isSubStructure(A.Right,B)
    }
    
    //helper 校验 B 是否与 A 的一个子树拥有相同的结构和节点值
    func helper(a,b *TreeNode) bool{
        if b == nil{
            return true
        }
        if a == nil{
            return false
        }
        if a.Val != b.Val{
            return false
        }
        //a.Val == b.Val 递归校验 A B 左子树和右子树的结构和节点是否相同
        return helper(a.Left,b.Left) && helper(a.Right,b.Right)
    }
    
  • 相关阅读:
    【Docker】11 私有仓库
    【Docker】10 容器存储
    【TypeScript】02 面向对象
    【TypeScript】01 基础入门
    【Spring】08 后续的学习补充 vol2
    【Vue】15 VueX
    【Vue】14 UI库
    【Vue】13 VueRouter Part3 路由守卫
    【Vue】12 VueRouter Part2 路由与传参
    【DataBase】SQL50 Training 50题训练
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/15027792.html
Copyright © 2020-2023  润新知