【问题标题】:Binary tree search not returning matching value when some nodes are null当某些节点为空时,二叉树搜索不返回匹配值
【发布时间】: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


【解决方案1】:

您可以考虑以下visitNode() 的重构版本。基本情况发生在传入节点为null 时,在这种情况下,函数只返回null。否则,它会检查当前节点是否与寻求的值匹配。如果不是,则递归地向左或向右遍历。

const visitNode = (node, val) => {
    if (node == null) return null;

    if (node.val === val) {
        console.log('MATCH!')
        return node;
    }

    if (val < node.val) {
        return visitNode(node.left, val);
    }
    else {
        return visitNode(node.right, val)
    }
}

【讨论】:

  • 所以,我做了 6 年软件工程师,完全忘记了在 BST 中,正确的节点值总是大于父节点的值。并为左侧反转。这会有所帮助!谢谢!
【解决方案2】:

如果你正在寻找二叉搜索树,试试这个

if (node == null || node.val === val) 
   return node;
 
// val is greater than node's val
if (node->val < val) 
   return visitNode(node.right, val); 

// val is smaller than node's val
return visitNode(node.left, val); 

或者你必须通过DFSBFS遍历树

【讨论】:

  • BST 是否总是遵循“currentNode.val
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多