zoukankan      html  css  js  c++  java
  • 树-树的子结构

    树-树的子结构

    输入两棵二叉树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)
    }
    
  • 相关阅读:
    edu_2_4_1
    edu_2_3_2
    edu_2_3_1
    edu_2_2_2
    edu_2_1_1
    edu_2_2_1
    hdu 1270 小希的数表
    hdu 2151 worm
    hdu1089 Ignatius's puzzle
    hdu 2190 悼念512汶川大地震遇难同胞——重建希望小学
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/15027792.html
Copyright © 2011-2022 走看看