【发布时间】:2021-04-30 21:24:12
【问题描述】:
TL;DR - 在给定具有空节点的 BST 的情况下,如何更改此算法以返回匹配的 val?
树节点:
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @param {number} val
* @return {TreeNode}
*/
给定一棵二叉树,找到匹配的值。我的算法如下
var searchBST = function(root, val) {
const matchingNode = visitNode(root, val);
// if no match, return null
return matchingNode ? matchingNode : null;
};
const visitNode = (node, val) => {
if (node.left !== null) {
return visitNode(node.left, val)
}
if (node.right !== null) {
return visitNode(node.right, val)
}
if (node.val === val) {
console.log('MATCH!')
return node;
}
}
这适用于没有 null 值的标准树,例如 [4,2,7,1,3] 和空树 []。
我遇到了具有空节点的树的问题,例如 [18, 2, 22, null, null, null, 63, null, 84, null, null]。
该功能似乎过早停止。如果我删除前两个 if 块中的返回值,我可以在匹配的 val 处停止递归,但无法获取要返回的值。
如何更改此算法以在给定具有空节点的 BST 的情况下返回匹配的 val?
【问题讨论】:
-
看起来您需要一些 OR 逻辑,而不仅仅是
return left subtree。如果它在右子树中怎么办?此外,如果这是 BST,您可能希望使用比较器函数来利用该结构将查找时间从 O(n) 缩短到 O(n log(n))(但首先要修复您的错误.. .) -
@ggorlen 哇,我是个白痴。很确定将
return visitNode(...)部分更改为foundNode = visitNode(...)... 并返回找到的节点会起作用。呃 -
当然,或者只是
return visitNode(node.left, val) || visitNode(node.right, val),只要您预先检查基本情况if (!node) return null。同样,使用比较器——这里的代码只是用于搜索二叉树而不是 BST。
标签: javascript algorithm recursion binary-search-tree