学习记录:js算法(五十七):二叉树中所有距离为 K 的结点

文章目录

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

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k ,返回到目标结点 target 距离为 k 的所有结点的值的数组。(可以任意顺序返回)

图一:

bash 复制代码
示例 1:
输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, k = 2
输出:[7,4,1]
解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1

示例 2:
输入: root = [1], target = 1, k = 3
输出: []

我的思路

没有思路,完全不会写
网上思路

递归、栈

网上思路

递归
js 复制代码
var distanceK = function (root, target, k) {
    const parentMap = new Map();

    // 构建父节点映射
    function buildParentMap(node, parent) {
        if (!node) return;
        parentMap.set(node, parent);
        buildParentMap(node.left, node);
        buildParentMap(node.right, node);
    }

    buildParentMap(root, null);

    // 找到目标节点
    let targetNode = null;
    function findTarget(node) {
        if (!node) return;
        if (node === target) {
            targetNode = node;
            return;
        }
        findTarget(node.left);
        findTarget(node.right);
    }

    findTarget(root);

    // BFS 找到距离为 k 的节点
    const result = [];
    const visited = new Set();
    const queue = [[targetNode, 0]]; // [节点, 当前距离]
    visited.add(targetNode);

    while (queue.length > 0) {
        const [currentNode, currentDistance] = queue.shift();

        if (currentDistance === k) {
            result.push(currentNode.val);
        }

        // 遍历子节点
        if (currentNode.left && !visited.has(currentNode.left)) {
            visited.add(currentNode.left);
            queue.push([currentNode.left, currentDistance + 1]);
        }

        if (currentNode.right && !visited.has(currentNode.right)) {
            visited.add(currentNode.right);
            queue.push([currentNode.right, currentDistance + 1]);
        }

        // 遍历父节点
        const parentNode = parentMap.get(currentNode);
        if (parentNode && !visited.has(parentNode)) {
            visited.add(parentNode);
            queue.push([parentNode, currentDistance + 1]);
        }
    }

    return result;
};

讲解
distanceK 函数:

  1. buildParentMap 函数通过 DFS 遍历树,并记录每个节点的父节点。
  2. findTarget 函数找到目标节点。
  3. 使用 BFS 从目标节点开始,记录当前节点的距离,并将距离为 k 的节点值添加到结果数组中。
  4. 返回结果数组。

js 复制代码
var distanceK = function (root, target, k) {
    const parentMap = new Map();
    const stack = [root];

    // DFS to record parent pointers
    while (stack.length) {
        const node = stack.pop();
        if (node.left) {
            parentMap.set(node.left, node);
            stack.push(node.left);
        }
        if (node.right) {
            parentMap.set(node.right, node);
            stack.push(node.right);
        }
    }

    const result = [];
    const visited = new Set();
    const queue = [[target, 0]]; // [node, current distance]

    // BFS to find nodes at distance k
    while (queue.length) {
        const [node, dist] = queue.shift();
        if (visited.has(node)) {
            continue;
        }
        visited.add(node);

        if (dist === k) {
            result.push(node.val);
        }

        // Explore neighbors: left, right, and parent
        if (node.left && !visited.has(node.left)) {
            queue.push([node.left, dist + 1]);
        }
        if (node.right && !visited.has(node.right)) {
            queue.push([node.right, dist + 1]);
        }
        const parent = parentMap.get(node);
        if (parent && !visited.has(parent)) {
            queue.push([parent, dist + 1]);
        }
    }

    return result;
};

讲解
distanceK 函数

  1. 使用一个栈来进行深度优先搜索(DFS),遍历整个树并记录每个节点的父节点。
  2. 使用一个队列进行广度优先搜索(BFS ),从目标节点开始,寻找距离为 k 的节点。
  3. BFS 中,我们检查当前节点的左子节点、右子节点和父节点。
  4. 如果当前距离等于 k,则将节点的值添加到结果数组中。

总结

没有思路,全靠网上的写法

相关推荐
程序员Agions7 小时前
React 自定义 Hooks 生存指南:7 个让你少加班的"偷懒"神器
前端·javascript
爱学习的小康7 小时前
js 文件读取 修改 创建
前端·javascript·vue.js
Z1Jxxx7 小时前
字符串翻转
开发语言·c++·算法
闻缺陷则喜何志丹7 小时前
【前缀和 期望】P7875 「SWTR-7」IOI 2077|普及+
c++·算法·前缀和·洛谷·期望
菜的不敢吱声7 小时前
swift学习第2,3天
python·学习·swift
CoovallyAIHub7 小时前
超越Sora的开源思路:如何用预训练组件高效训练你的视频扩散模型?(附训练代码)
深度学习·算法·计算机视觉
Sailing7 小时前
AI 流式对话该怎么做?SSE、fetch、axios 一次讲清楚
前端·javascript·面试
橙露7 小时前
Vue3 组件通信全解析:技术细节、适用场景与性能优化
前端·javascript·vue.js
源来猿往7 小时前
yolov8n结构化剪枝
算法·yolo·剪枝
l04090442227 小时前
想学习VLN相关的知识,并亲手搭建一套系统,该如何入手?
学习