输入两棵二叉树A
和B
,判断B
是不是A
的子结构
约定空树
不是任意一个树的子结构
B
是A
的子结构
即 A
中有出现和 B
相同的结构和节点值
若树 B
是树 A
的子结构
则子结构的根节点可能为树 A
的任意一个节点
所以要遍历 A
树的每个节点
依次与 B
的每个节点进行比较
当节点 B
为空:说明树 B
已匹配完成(越过叶子节点),因此返回 true
当节点 A
为空:说明已经越过树 A
叶子节点,即匹配失败,返回 false
当节点 A
和 B
的值不同:说明匹配失败,返回 false
语言: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
}
欢迎体验我的作品之一:小五笔 86 版
五笔学习好帮手~
App Store
搜索即可~