[路飞]leetcode-863.二叉树中所有距离为 K 的结点

110 阅读1分钟

给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 k 。

返回到目标结点 target 距离为 k 的所有结点的值的列表。 答案可以以 任何顺序 返回。力扣原文

示例 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
输出: []

解题:


var distanceK = function (root, target, k) {
  if (!root) return [];
  let targetNode = null;
  let result = [],
    paths = [];


  //寻找target节点
   getTarget(root, target);
  //  向下寻找目标节点
  getNode(targetNode, k);
  // 向上查找
  while (targetNode.parent && k > 0) {
    targetNode = targetNode.parent;
    getNode(targetNode, --k);
  }

  // 寻找目标节点
  function getNode(node, k) {
    if (node === null || paths.indexOf(node) !== -1) {
      return;
    }
    paths.push(node);
    if (k > 0) {
        getNode(node.left, k - 1);
      getNode(node.right,  k - 1);
    } else if (k === 0) {
      result.push(node.val);
    }
  }
  function getTarget(node, target) {
    if (!root || targetNode) return;
    if (node.val === target.val) {
      targetNode = node;
    }
    if (node.left) {
      node.left.parent = node;
      getTarget(node.left, target);
    }
    if (node.right) {
      node.right.parent = node;
      getTarget(node.right, target);
    }
  };
  return result;
};