Возвращение значения в конце рекурсивного обхода двоичного дерева поиска в JavaScript - PullRequest
0 голосов
/ 14 июля 2020

образец структуры BST

Мне нужно пройти через BST и вернуть значение узла, наиболее близкое к заданному целевому целочисленному значению.

Обход может быть выполнен следующим образом:

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)
}

Как я узнаю, что обход всего дерева завершен? Я могу создать переменную вне области действия функции обхода и вернуть ее, но могу ли я каким-то образом вернуть ее из рекурсивной функции? например:

function findClosestValueInBst(tree, target, output) {
    return traverse(tree, target, Infinity, 0) // returns 13
}

1 Ответ

1 голос
/ 14 июля 2020
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))
}
...