剑指Offer26.树的子结构Golang版

1. 问题描述

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

2. 思路

  1. 在A中搜索,查找到第一个和B相同的节点
  2. 从找到的节点开始,比较A中是否存在B相同的部分。

3. 代码

3.1. 代码思路

从A的Root开始,向下是否含有和B相同

/**
 * 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 false
    }
    return isSub(A, B)
}

func isSub(A *TreeNode, B *TreeNode) bool {
    if B == nil {
        return true
    }
    if A == nil || A.Val != B.Val {
        return false
    }
    return isSub(A.Left, B.Left) && isSub(A.Right, B.Right)
}

从A的任意子节点开始,向下是否含有和B相同

func isSubStructure(A *TreeNode, B *TreeNode) bool {
    if A == nil || B == nil {
        return false
    }
    return isSub(A, B) || isSubStructure(A.Left) || isSubStructure(A.Right)
}

3.2. 深度优先遍历,查找任意节点开始,是否有子树

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSubStructure(A *TreeNode, B *TreeNode) bool {
    var res bool

    if A == nil || B == nil {
        return false
    }

   dfs(A, B, &res)
   return res
}

func dfs(A *TreeNode, B *TreeNode, res *bool) {
    if A == nil {
        return
    }

    if A.Val == B.Val && isSub(A, B){
        *res = true
        return
    }
    dfs(A.Left, B, res)
    dfs(A.Right, B, res)
}

func isSub(A *TreeNode, B *TreeNode) bool {
    if B == nil {
        return true
    }
    if A == nil || A.Val != B.Val {
        return false
    }
    return isSub(A.Left, B.Left) && isSub(A.Right, B.Right)
}