记录 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
}