0x00 题目
输入两棵二叉树A和B,判断B是不是A的子结构
约定空树不是任意一个树的子结构
B是A的子结构
即 A 中有出现和 B 相同的结构和节点值
0x01 思路
若树 B 是树 A 的子结构
则子结构的根节点可能为树 A 的任意一个节点
所以要遍历 A 树的每个节点
依次与 B 的每个节点进行比较
当节点 B 为空:说明树 B 已匹配完成(越过叶子节点),因此返回 true 当节点 A 为空:说明已经越过树 A 叶子节点,即匹配失败,返回 false 当节点 A 和 B 的值不同:说明匹配失败,返回 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 搜索即可~










