Я пытаюсь получить минимальное значение из моего двоичного дерева, но я получаю сообщение об ошибке превышения максимального размера стека вызовов. Как правильно получить минимальное значение элементов в двоичном дереве поиска?
Вот мой код в 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());
Как @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
}
Проблема в том, что вы не продвигаете узел, когда вы проходите его. Вы просто продолжаете устанавливать 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
следующему узлу, если он существует, или корень, если он первый вызов. Это не будет возвращаться навсегда, потому что оно продвигается и пересекает дерево.
node
. Вы устанавливаете это в корень на каждом рекурсе.