树-树的子结构

树-树的子结构

输入两棵二叉树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)
}
posted @ 2021-07-18 21:28  maob  阅读(45)  评论(0编辑  收藏  举报