2017-06-29 9 views
1

私のバイナリツリーから最小値を取得しようとしていますが、最大呼び出しスタックサイズを超えたというエラーが発生しています。バイナリ検索ツリーの項目の最小値を正しく取得するにはどうすればよいですか?ここでツリーをたどるときにコールスタックの最大サイズを超えるのはなぜですか?

は​​で私のコードです:

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'を進めていません。あなたはすべての再帰でルートに設定します。 – Li357

+0

は最新ではありませんか?何が正しい方法ですか.t最小値を得る – user5711656

+0

再帰的メソッドのパラメータとして渡すか、インスタンスに '.currentSearchNode'プロパティを保持し、' this.root'の代わりにそれを使用する必要がありますsoあなたはどこにいるのかを把握することができます。これは*意味*のデータセットに対してスタックを簡単にオーバーフローさせることができることに注意してください。直接の再帰を処理するには、JavaScriptは優れていません。代わりに、いつでもトランポリン・サンクをすることができます。 –

答えて

0

@AndrewLiが言及したのように。あなたの代わりに、問題は、あなたがそれを通過するときにノードを進めていないということであるあなたの関数の定義

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

はい私も同じことを考えていました。しかし、あなたがコメントで最初に応答して以来、クレジットはあなたに行く – karthick

1

を変更

var node = this.root; 

を書き込むことによって、再び同じルートを設定しています。あなたはちょうど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がある場合は次のノードに割り当て、最初の呼び出しの場合はルートに割り当てます。これは進んで木を横切るため、これは永遠に繰り返されません。

関連する問題