Почему максимальный размер стека вызовов превышен, когда я пересекаю свое дерево?

1

Я пытаюсь получить минимальное значение из моего двоичного дерева, но я получаю сообщение об ошибке превышения максимального размера стека вызовов. Как правильно получить минимальное значение элементов в двоичном дереве поиска?

Вот мой код в JSBin:

function Node(val){
    this.value = val;
    this.left = null;
    this.right = null;
}

function BinarySearchTree(){
    this.root = null;
}
BinarySearchTree.prototype.minNode =function() {
    var node = this.root;
    if(!node){
        return 0;
    }
    if(node.left){
        return this.minNode(node.left)
    }
    return node.value
}

BinarySearchTree.prototype.push = function(val){
    var root = this.root;

    if(!root){
        this.root = new Node(val);
        return;
    }

    var currentNode = root;
    var newNode = new Node(val);

    while(currentNode){
        if(val < currentNode.value){
            if(!currentNode.left){
                currentNode.left = newNode;
                break;
            }
            else{
                currentNode = currentNode.left;
            }
        }
        else{
            if(!currentNode.right){
                currentNode.right = newNode;
                break;
            }
            else{
                currentNode = currentNode.right;
            }
        }
    }

}

var bt = new BinarySearchTree();
bt.push(23);
bt.push(1);
bt.push(2);
bt.push(25);
console.log(bt.minNode());
  • 2
    Вы не продвигаете node . Вы устанавливаете это в корень на каждом рекурсе.
  • 0
    это не актуально? какой правильный путь .t получить минимальное значение
Показать ещё 1 комментарий
Теги:
data-structures

2 ответа

0
Лучший ответ

Как @AndrewLi упоминается. Вы снова устанавливаете тот же корень, записывая

var node = this.root;

Вместо этого измените определение своей функции

BinarySearchTree.prototype.minNode =function(nextNode) {
    var node = nextNode || this.root;
    if(!node){
        return 0;
    }
    if(node.left){
        return this.minNode(node.left)
    }
    return node.value
}
  • 0
    Да, я тоже думал о том же. Но кредиты должны идти к вам, так как вы ответили первым в комментарии
1

Проблема в том, что вы не продвигаете узел, когда вы проходите его. Вы просто продолжаете устанавливать node на корневой элемент, поэтому он повторяется навсегда. Определение такой функции должно работать:

BinarySearchTree.prototype.minNode = function(nextNode) {
  var node = nextNode || this.root;
  if(!node) {
    return 0;
  }
  if(node.left) {
    return this.minNode(node.left)
  }
  return node.value
}

Это заставит функцию принять аргумент для следующего узла. Затем он назначит node следующему узлу, если он существует, или корень, если он первый вызов. Это не будет возвращаться навсегда, потому что оно продвигается и пересекает дерево.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню