0
点赞
收藏
分享

微信扫一扫

【二叉树】树的子结构


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​​ 搜索即可~


举报

相关推荐

0 条评论