在二叉树中从根到节点的返回路径

时间:2019-04-29 23:07:56

标签: javascript algorithm tree traversal

我正在尝试完成看似简单但难以实现的事情。给定一棵二叉树和一个节点,返回路径。我在下面尝试过,但是我真的被卡住了。我也不完全确定一旦找到目标节点,如何退出递归函数。

const tree = {
  val: 3,
  left: {
    val: 5,
    left: {
      val: 6,
      left: null,
      right: null
    },
    right: {
      val: 2,
      left: null,
      right: null
    }
  },
  right: {
    val: 1,
    left: null,
    right: null
  }
};

const findPathFromRoot = (currentNode, targetNode, path) => {
  path + currentNode.val;

  if (currentNode === targetNode) {
    return path + targetNode.val;
  }

  findPathFromRoot(currentNode.left, targetNode, path);
  findPathFromRoot(currentNode.right, targetNode, path);
}

const target = tree.left.right;
console.log(findPathFromRoot(tree, target, '')); // should return "352"

3 个答案:

答案 0 :(得分:2)

const findPathFromRoot = (root, target, path = "") => {
  if (root === null) {
    return null;
  }
  path = path + root.val;
  if (root === target) {
    return path;
  }

  const left = findPathFromRoot(root.left, target, path);
  const right = findPathFromRoot(root.right, target, path);

  return left || right;
};

为什么这样做?

Return语句始终返回到调用方,在您的情况下,仅当找到目标时才返回,然后又返回到findPathFromRoot(currentNode.left,...)或findPathFromRoot(currentNode.right, ...)。但是这些不会自我回报。因此,如果您在左侧或右侧子树中找到目标,则对代码的修复是返回。

答案 1 :(得分:1)

就像评论中提到的那样,如果对树进行排序,则可以使速度更快。

就这样,每个节点都需要检查。.

您的尝试几乎在那儿,首先需要检查您是否有左节点或右节点,然后我检查左节点,如果找到该树下方的节点将返回,否则返回然后将尝试正确的节点。它以递归方式执行此操作,以便访问每个可能的节点。

下面是一个有效的示例。

const tree = {
  val: 3,
  left: {
    val: 5,
    left: {
      val: 6,
      left: null,
      right: null
    },
    right: {
      val: 2,
      left: null,
      right: null
    }
  },
  right: {
    val: 1,
    left: null,
    right: null
  }
};

const findPathFromRoot = (currentNode, targetNode, path) => {
  path += currentNode.val;
  if (currentNode === targetNode) {
    return path;
  }
  let ret = null;
  if (currentNode.left) ret = findPathFromRoot(currentNode.left, targetNode, path);
  if (currentNode.right && !ret) ret = findPathFromRoot(currentNode.right, targetNode, path);
  return ret;
}

const target = tree.left.right;
console.log(findPathFromRoot(tree, target, '')); // should return "352"

答案 2 :(得分:0)

您需要放入逻辑来确定是从当前节点的值向左还是向右移动,并根据该逻辑用currentNode.left或currentNode.right调用您的方法。然后,当您获得空值(这意味着目标在树中不存在)时返回,或者在currentNode.value === target时返回。

树也有问题,根左边的所有值都必须大于根的值,并且根右边的所有值都必须较小,但看起来2是在根的左侧(该值为3)。