2017-06-29 2 views
1

Ich versuche, den Mindestwert von meinem Binärbaum zu bekommen, aber ich bekomme einen Fehler, dass die maximale Call-Stack-Größe überschritten wurde. Wie erhalte ich den Mindestwert von Elementen in einem binären Suchbaum korrekt?Warum wird die maximale Größe des Aufruf-Stacks überschritten, wenn ich meinen Baum durchquere?

Hier ist mein Code bei 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

Sie schreiten nicht 'node' voran. Sie legen es bei jeder Rekursion auf die Wurzel fest. – Li357

+0

ist es nicht aktuell? Wie lautet die richtige Methode?. tt Minimum-Wert erhalten – user5711656

+0

Sie müssen es entweder als Parameter an die rekursive Methode übergeben, oder Sie müssen eine '.currentSearchNode' -Eigenschaft für die Instanz behalten und diese anstelle von' this.root' verwenden Sie können verfolgen, wo Sie sind. Beachten Sie, dass dies * den * Stack für jedes aussagekräftige Dataset problemlos überlaufen kann. JavaScript ist nicht gut im Umgang mit direkter Rekursion. Sie können stattdessen immer Trampolinthunks verwenden. –

Antwort

0

Wie @AndrewLi erwähnt. Sie sind wieder die gleiche Wurzel Einstellung von

var node = this.root; 

Statt die Definition Ihrer Funktion ändern

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

Ja, ich dachte auch über das Gleiche nach. Aber Credits sollten dir gehören, da du zuerst im Kommentar geantwortet hast – karthick

1

Das Problem ist das Schreiben, dass Sie nicht den Knoten voran, wenn Sie es durchqueren. Sie setzen einfach node auf das Root-Element, so dass es für immer rekursiv ist. Definieren der Funktion wie sollte so funktionieren:

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 
} 

Dadurch wird die Funktion ein Argument für die nächsten Knoten akzeptieren. Dann wird es node dem nächsten Knoten zuweisen, wenn es existiert, oder dem Stamm, wenn es der erste Aufruf ist. Dies wird nicht für immer rekurrieren, weil es den Baum vorantreibt und durchquert.

Verwandte Themen