0
点赞
收藏
分享

微信扫一扫

【二叉树】寻找重复的子树


0x00 题目

给定一棵二叉树 ​​root​​​ 返回所有 ​​重复​​ 的子树
对于同一类的重复子树
你只需要返回其中 ​​任意一棵​​ 的根结点即可
如果两棵树具有​​相同的结构​​ 和 ​​相同的结点值​​ 则它们是重复的

0x01 思路

如何判断 ​​重复​​​ 的子树
先不管子树,针对 ​​​重复​​​ 你会想到什么?
自然会想到 ​​哈希表​​ 具有查重的性质
怎么实现重复的 ​​判断​​ 呢
如何设计能够让 ​​重复的结构​​ 体现出来呢?
针对单个节点进行记录,无法体现出一棵 ​​完整​​ 的子树
那如何表示一棵 ​​完整的​​ 子树呢?
想想,再想想
二叉树的 ​​序列化​​ 问题
不就是以一个 ​​字符串​​ 来表示一棵完整的树么
需要对 ​​每个节点​​ 的子树都进行判断
所以利用 ​​递归​​ 来处理
使用 ​​后序​​ 遍历的方式
才能获取到子树的结构

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 findDuplicateSubtrees(_ root: TreeNode?) -> [TreeNode?] {
// 记录出现次数
var dic: [String:Int] = [:]
var res: [TreeNode] = []

func dfs(_ root: TreeNode?) -> String {
guard let root = root else { return "#" }

// 左子树
let left = dfs(root.left)
// 右子树
let right = dfs(root.right)
// 路径
let path = left + "," + right + "," + "\(root.val)"

// 存在
if let count = dic[path] {
// 增加次数
dic[path] = count + 1
// 之前出现过,说明是有重复的
if count == 1 {
res.append(root)
}
}else{
dic[path] = 1
}

return path
}

_ = dfs(root)

return res
}

0x03 我的作品

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


举报

相关推荐

0 条评论