0x00 题目

给定一个二叉树具有根结点 root
一个目标结点 target,和一个整数值 k
返回到目标结点 target 距离为 k
所有结点的值的列表
答案可以以任何顺序返回


0x01 思路

如果 target节点
通过深度优先方法遍历
找出深度k节点即可

target 不是 根节点
如何根据当前节点找出父节点呢?
可以通过字典解决
当前节点值为 key
父节点为 value

所以要先遍历整棵树
然后查找


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 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进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注