跳到主要内容
0%
约 1 分钟

剑指 Offer 26. 树的子结构


题目

剑指 Offer 26. 树的子结构

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

代码

Go: DFS深度优先搜索

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isSameTree(A *TreeNode, B *TreeNode) bool {
    if A==nil&&B!=nilA==nil&&B!=nil{
        return false
    }else if A!=nil&&B!=nil{
        if A.Val!=B.Val{
            return false
        }else if isSameTree(A.Left,B.Left)==falseisSameTree(A.Right,B.Right)==false{
            return false
        }
    }
    return true
}

func DFS(root *TreeNode,B *TreeNode) bool{
    if root==nil{
        return false
    }
    if isSameTree(root,B){
        return true
    }else if root.Left!=nil&&DFS(root.Left,B){
        return true
    }else if root.Right!=nil&&DFS(root.Right,B){
        return true
    }
    return false
}

func isSubStructure(A *TreeNode, B *TreeNode) bool {
    if B==nil{
        return false
    }
    return DFS(A,B)
}

**优化后的代码:**时间不变,内存占用减少

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

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

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

向 AI 提问(基于本文内容)

评论