0x00 题目
给定一个二叉树(具有根结点 root
)
一个目标结点 target
,和一个整数值 k
返回到目标结点 target
距离为 k
的
所有结点的值的列表
答案可以以任何顺序返回
0x01 思路
如果 target
是 根节点
通过深度优先
方法遍历
找出深度为 k
的节点即可
当 target
不是 根节点
时
如何根据当前节点找出父节点
呢?
可以通过字典
来解决
以当前节点值为 key
父节点为 value
0x02 解法
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 distanceK(_ root: TreeNode?, _ target: TreeNode?, _ k: Int) -> [Int] {
var res: [Int] = []
var parent: [Int:TreeNode] = [:]
// 查找出所有节点的父节点
func findParent(_ root: TreeNode?) {
guard let r = root else { return }
if r.left != nil {
parent[r.left!.val] = r;
findParent(r.left)
}
if r.right != nil {
parent[r.right!.val] = r;
findParent(r.right)
}
}
// 查找
func find(_ root: TreeNode?, _ pre: TreeNode?, _ dep: Int, _ k: Int) {
guard let r = root else { return }
// 深度相同,找到
if dep == k {
res.append(r.val)
return
}
// 往左找
if r.left !== pre {
find(r.left, r, dep+1, k)
}
// 往右找
if r.right !== pre {
find(r.right, r, dep+1, k)
}
// 往父节点找,过滤目标节点的子节点
if parent[r.val] !== pre {
find(parent[r.val], r, dep+1, k)
}
}
findParent(root)
// 从目标节点开始找
find(target, nil, 0, k)
return res
}
0x03 我的作品
欢迎体验我的作品之一:小编辑器
在线编辑器,包含多种语言
App Store
搜索即可~
原文地址:https://blog.csdn.net/xjh093/article/details/125261681
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_41788.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。