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