【二叉树】树的子结构

0x00 题目

输入两棵二叉树AB,判断B是不是A的子结构
约定空树不是任意一个树的子结构

BA的子结构
A 中有出现和 B 相同的结构和节点值


0x01 思路

若树 B 是树 A 的子结构
则子结构的根节点可能为树 A 的任意一个节点
所以要遍历 A 树的每个节点
依次与 B 的每个节点进行比较
当节点 B 为空:说明树 B 已匹配完成(越过叶子节点),因此返回 true
当节点 A 为空:说明已经越过树 A 叶子节点,即匹配失败,返回 false
当节点 AB 的值不同:说明匹配失败,返回 false


0x02 解法

语言:Swift

树节点:TreeNode

public class TreeNode {
    public var val: Int
    public var left: TreeNode?
    public var right: TreeNode?
    public init() { self.val = 0; self.left = nil; self.right = nil; }
    public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
    public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
        self.val = val
        self.left = left
        self.right = right
    }
}

解法:

func isSubStructure(_ A: TreeNode?, _ B: TreeNode?) -> Bool {
    func dfs(_ a: TreeNode?, _ b: TreeNode?) -> Bool {
        if b == nil { return true } // B 到头了
        if a == nil { return false } // A 到头了
        if a!.val != b!.val { return false } // 值不相等
        return dfs(a?.left, b?.left) && dfs(a?.right, b?.right)
    }
    
    guard let _ = A else { return false }
    guard let _ = B else { return false }

    let b1 = dfs(A, B)
    let b2 = isSubStructure(A?.left, B)
    let b3 = isSubStructure(A?.right, B)
    
    return b1 || b2 || b3
}

0x03 我的小作品

欢迎体验我的作品之一:小五笔 86 版
五笔学习好帮手~
App Store 搜索即可~


猜你喜欢

转载自blog.csdn.net/xjh093/article/details/126244515