【发布时间】:2023-12-18 01:48:01
【问题描述】:
我正在尝试解决一个问题:在二叉树中查找特定节点的所有祖先。
Input: root, targetNode
Output: An array/list containing the ancestors
假设,我们以上面的二叉树为例。我们想找到节点 4 的祖先。输出应该是 [3, 5, 2, 4]。如果节点为8,则输出为[3, 1, 8]
为了解决这个问题,我编写了一个实现 DFS 的函数。
var ancestor = function(root, target) {
var isFound = false;
const dfs = (node, curr) => {
if (node === null) {
return curr;
}
if (node.val === target.val) {
curr.push(node.val);
isFound = true;
return curr;
}
curr.push(node.val);
const left = dfs(node.left, curr);
if (!isFound) {
const right = dfs(node.right, curr);
curr.pop();
return right;
} else {
curr.pop();
return left;
}
}
console.log(dfs(root, []));
};
但它没有返回正确的输出。例如,如果targetNode为7,则输出为[3],如果targetNode为8,则输出也是[3]。如果我删除curr.pop() 行,输出也无效。对于 targetNode 7,它是 [3, 5, 6, 2, 7]。我想我发现了我犯错的问题。在回溯时,我在删除curr 数组中推送的节点时做错了。如果我传递一个字符串而不是数组,它会正确打印输出。
var ancestor = function(root, target) {
var isFound = false;
const dfs = (node, curr) => {
if (node === null) {
return curr;
}
if (node.val === target.val) {
curr += node.val;
isFound = true;
return curr;
}
const left = dfs(node.left, curr + node.val + '->);
if (!isFound) {
const right = dfs(node.right, curr + node.val + '->);
return right;
} else {
return left;
}
}
console.log(dfs(root, ''));
上面的代码用字符串而不是数组正确打印输出,如果我通过targetNode 7,输出是3->5->2->7
我的问题是,如何在这里正确取消选择/回溯?还是我做错了什么?提前致谢。
【问题讨论】:
标签: recursion binary-tree depth-first-search backtracking