简体   繁体   English

在 JavaScript 中递归二叉搜索树遍历结束时返回一个值

[英]Returning a value at the end of a recursive binary search tree traversal in JavaScript

样本 BST 结构

I need to traverse a BST and return the node value that is closest to the supplied target integer value.我需要遍历 BST 并返回最接近提供的目标 integer 值的节点值。

The traversal can be done as follows:遍历可以如下进行:

function traverse(node, target, closestValue) {
    console.log(node.value);
    let potentialClosestValue = Math.abs(node.value - target)
    if (potentialClosestValue < closestValue) { closestValue = potentialClosestValue; }
    
    if (node.left) {
        traverse(node.left, target, closestValue)
    }
    if (node.right) {
        traverse(node.right, target, closestValue)
    }
}

function findClosestValueInBst(tree, target) {
    traverse(tree, target, Infinity)
}

How do I know that the entire tree traversal has finished?我怎么知道整个树遍历已经完成? I can create a variable out of scope of the traverse function and return that, but can I return it from the recursive function somehow?我可以从遍历 function 的 scope 中创建一个变量并返回它,但是我可以从递归 function 以某种方式返回它吗? eg:例如:

function findClosestValueInBst(tree, target, output) {
    return traverse(tree, target, Infinity, 0) // returns 13
}
function traverse(node, target, closestValue) {
    console.log(node.value);
    let potentialClosestValue = Math.abs(node.value - target)
    if (potentialClosestValue < Math.abs(closestValue - target)) { closestValue = node.value; }
    
    if (node.right) {
        let res = traverse(node.right, target, closestValue)
        if (Math.abs(res-target) < Math.abs(closestValue - target) closestValue = res
    }
    if (node.left) {
        let res = traverse(node.left, target, closestValue)
        if (Math.abs(res-target) < Math.abs(closestValue - target) closestValue = res 
    }
    return closestValue
}

function findClosestValueInBst(tree, target) {
    console.log(traverse(tree, target, Infinity))
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM