[路飞]二叉树中所有距离为 K 的节点

77 阅读1分钟

记录 1 道算法题

二叉树中所有距离为 K 的节点

863. 二叉树中所有距离为 K 的结点 - 力扣(LeetCode)


要求:二叉树中的某一个节点 target,找到其他节点和 target 的距离为 k 的节点。每一个联系算距离 1。没有方向限制。

解题的思路是需要建立一个双向的关系,让子节点可以查找到父节点。然后从 target 出发一直递归,走到距离为 k 就停止递归。

由于从父节点往子节点走的时候,父节点已经被确认过了,不需要再从子节点往父节点走,所以可以传递节点检查重复。

    function distanceK(root, target, k) {
        // 建立双向联系
        const map = {}
        const f = (node, p) => {
            if (!node) return
            
            map[node.val] = p
            
            f(node.left)
            f(node.right)
        }
        
        f(root)
        
        // 查找距离为 k 的节点
        const res = []
        const find = (node, distance, from, k) => {
            if (!node) return
            // 当距离足够的时候
            if (distance === k) {
                return res.push(node.val)
            }
            // 递归检查子节点,父节点,不重复
            if (node.left !== from) {
                find(node.left, distance + 1, node, k)
            }
            if (node.right !== from) {
                find(node.right, distance + 1, node, k)
            }
            if (map[node.val] !== from) {
                find(map[node.val], distance + 1, node, k)
            }
        }
        
        f(target, 0, null, k)
        
        return res
    }