2011-12-06 9 views
-2
var m_root : Node = root 
    private def insert(key: Int, value: Int): Node = { 
     if(m_root == null) { 
      m_root = Node(key, value, null, null) 
     } 
     var t : Node = m_root 
     var flag : Int = 1 
     while (t != null && flag == 1) { 
      if(key == t.key) { 
       t 
      } 
      else if(key < t.key) { 
       if(t.left == null) { 
        t.left = Node(key, value, null, null) 
        flag = 0 
       } else { 
        t = t.left 
       } 

      } else { 
       if(t.right == null) { 
        t.right = Node(key, value, null, null) 
        flag = 0 
       } else { 
        t = t.right 
       } 
      } 
     } 
     t 
} 

私はバイナリ検索ツリーにノードを挿入しました。私はノードが作成されたときに終了したいが、終了条件を割り当てなかったと思うので停止しない。ノードを挿入したときに終了するようにコードを編集するにはどうすればいいですか?なぜ終了しないのですか?

+3

「バイナリ検索ツリーの侮辱」?もっと同意できませんでした。 –

+0

@KimStebel申し訳ありません、タイプA TT – Silvester

+0

スタイルの点では、 'flag'を' carryOn'に名前を変更し、最初は 'true'だったが' false'を割り当てられたブール変数にするとコードが少し鮮明になりますループを終了させたいときに使用します。 – dave4420

答えて

5

あなたはどんな振る舞いをしているのかよく分かりませんが、その原因ははっきりしています。

ループはwhileの条件で、tがループするループはnullです。そのため、tはnullではありませんが、ループは続行されます。

あなたは今まで非null値にtを割り当てる - 実際には、あなたはは、具体的 nullの場合のためにチェックしていると、新しいノードを作成することによって、それが起こって停止します。

したがって、実際のアルゴリズム要件に応じて、tが実際にはnullになることがあるか、または場合によってはループ状態を再考する必要があります。

tを下部に返すので、条件が間違っていることをお勧めします。これが終了する可能性のある唯一の方法は、この時点でtがnullの場合です。したがって、これを返すのは意味がありません。比較がtrueの場合

+0

あなたのコメントに影響を与えたが、自分自身を終了することはできません。 – Silvester

+0

@Jaehyun(あなたの編集に基づいて) - ノードがすでに存在する一般的なケースで何が起こるかを考えてください。最初の 'if'ブロック内の終了ケースで' flag'をゼロに正しく設定していないので、その時点で 'while'ループの周りは永遠に回転します。 –

+0

また、dave4420には、より良い名前の 'boolean'フラグが必要であることに同意します。また、継続するかどうかを決定するフラグが追加されているので、while条件に 't!= null'チェックを含める必要はありません。 –

4

ループ

if(key == t.key) { 
    t 
} 

であなたの "IF" 文の最初の句は...何もしません。ループを終了しません。ステートメントtはここではreturn tと同義ではありません。その時点でflag = 0を設定してループを終了することができます。

関連する問題