2013-05-05 64 views
1

我已經在C#中編寫了用於實現AVL_trees的代碼。我遇到了一些節點問題,這就是爲什麼我無法在節點中插入數據的原因。以下是我的代碼。無法在avl_tree中添加節點

public class avl_node 
{ 
    public int Data; 
    public avl_node Left; 
    public avl_node Right; 
    public int height; 

    public void DisplayNode() 
    { 
     Console.Write("{0}", Data); 
    } 
} 



public class avl_tree 
{ 
    public avl_node root; 

    public avl_tree() 
    { 
     root = null; 
    } 

    public void Insert(int i) 
    { 
     avl_node newNode = new avl_node(); 
     newNode.Data = i; 
     newNode.height = newNode.height + 1; 
     if (root == null) 
     { 
      root = newNode; 
     } 
     else 
     { 
      avl_node current = root; 
      avl_node parent; 
      while (true) 
      { 
       parent = current; 
       if (i < current.Data) 
       { 
        current = current.Left; 
        if (current == null) 
        { 
         parent.Left = newNode; 
         break; 
        } 
        else 
        { 
         current = current.Right; 
         if (current == null) 
         { 
          parent.Right = newNode; 
          break; 
         } 
        } 
       } 
      } 
     } 
    } 


    public void InOrder(avl_node node) 
    { 
     if (!(node == null)) 
     { 
      InOrder(node.Left); 
      node.DisplayNode(); 
      InOrder(node.Right); 
     } 
    } 
} 



class Program 
{ 
    static void Main(string[] args) 
    { 
     avl_tree nums = new avl_tree(); 
     nums.Insert(23); 
     nums.Insert(45); 
     nums.Insert(16); 
     nums.Insert(37); 
     nums.Insert(3); 
     nums.Insert(99); 
     nums.Insert(22); 
     avl_node nd = new avl_node(); 
     nd = nums.Search(37); 

     Console.WriteLine("Inorder traversal: "); 
     nums.InOrder(nums.root); 
    } 
} 

我得到的只是一個黑色的控制檯屏幕。我很困擾。

希望能有更好的迴應。

問候 烏默爾

+0

你的'Search'函數是什麼樣的?如果你在主函數的每一行之間放置打印語句,哪一行會停止? – Xymostech 2013-05-05 00:31:13

+0

@Xymostech忘記搜索功能。我忘了評論該行。由於整個代碼已被註釋掉,該行對程序沒有影響!我不知道爲什麼我無法在控制檯窗口上獲得任何東西! – 2013-05-05 00:41:17

回答

1

「我得到的是一個黑色的控制檯屏幕」

23後插入,你插入()方法被卡在while循環,因爲45是從未小於23 :

 while (true) 
     { 
      parent = current; 
      if (i < current.Data) 
       // you never get in here, so we just loop around in "while (true)" 
1

看看在插入方法循環,​​你會得到卡在循環每次嘗試插入任何值比樹已經存在的價值更大。

它會因爲這個條件而發生:if(i < current.data)。 else語句在哪裏?你把它放在提到的條件範圍內。所以它永遠不會被達到,因此程序將運行無限循環。

您應該在else語句之前放置一個「}」,否則將會超出第一個if語句的範圍。並在方法結尾處刪除「}」中的一個。

這樣它應該運行得很好。