2012-04-28 133 views
6
class Node 
{ 
    public int data; 
    public Node left, right; 

    public Node(int data) 
    { 
     this.data = data; 
     left = null; 
     right = null; 

    } 
} 

class BinaryTreeImp 
{ 
    Node root; 
    static int count = 0; 

    public BinaryTreeImp() 
    { 
     root = null; 

    } 
    public Node addNode(int data) 
    { 
     Node newNode = new Node(data); 

     if (root == null) 
     { 
      root = newNode; 

     } 
     count++; 
     return newNode; 


    } 

    public void insertNode(Node root,Node newNode) 
    { 
     Node temp; 
     temp = root; 

     if (newNode.data < temp.data) 
      { 
       if (temp.left == null) 
       { 
        temp.left = newNode; 

       } 

       else 
       { 
        temp = temp.left; 
        insertNode(temp,newNode); 

       } 
      } 
      else if (newNode.data > temp.data) 
      { 
       if (temp.right == null) 
       { 
        temp.right = newNode; 

       } 

       else 
       { 
        temp = temp.right; 
        insertNode(temp,newNode); 
       } 
      } 
     } 


    public void displayTree(Node root) 
    { 
     Node temp; 
     temp = root; 

     if (temp == null) 
      return; 
      displayTree(temp.left); 
      System.Console.Write(temp.data + " "); 
      displayTree(temp.right); 


    } 

    static void Main(string[] args) 
    { 
     BinaryTreeImp btObj = new BinaryTreeImp(); 
     Node iniRoot= btObj.addNode(5); 


     btObj.insertNode(btObj.root,iniRoot); 
     btObj.insertNode(btObj.root,btObj.addNode(6)); 
     btObj.insertNode(btObj.root,btObj.addNode(10)); 
     btObj.insertNode(btObj.root,btObj.addNode(2)); 
     btObj.insertNode(btObj.root,btObj.addNode(3)); 
     btObj.displayTree(btObj.root); 

     System.Console.WriteLine("The sum of nodes are " + count); 
     Console.ReadLine(); 

    } 
} 

這是implementation.The代碼的代碼工作正常,但如果在displayTree功能,我用二叉搜索樹在C#實現

public void displayTree(Node root) 
{ 
    Node temp; 
    temp = root; 

    while(temp!=null) 
    { 
     displayTree(temp.left); 
     System.Console.Write(temp.data + " "); 
     displayTree(temp.right); 
    } 

} 

更換一個無限循環引起的。我不明白是什麼導致了這一點。我還想知道是否有更好的方式在C#中實現BST。

+1

投票結束:要求陌生人通過檢查發現代碼中的錯誤並不富有成效。您應該使用調試器或打印語句來識別(或至少隔離)問題,然後回來一個更具體的問題(一旦您將其縮小到10行[測試案例](http:///sscce.org))。 – 2012-04-28 18:35:30

回答

5

我不知道爲什麼你需要這個循環,但回答你的問題:

while(temp!=null) 
{ 
    displayTree(temp.left); 
    System.Console.Write(temp.data + " "); 
    displayTree(temp.right); 
} 

此代碼檢查是否tempnull,但它永遠不會變成零,導致循環您行動只有在溫度的葉子上。這就是爲什麼你有一個infinit循環。

+0

如果temp.left.left爲空,是不是會返回到temp.left循環? – YuNo 2012-04-28 19:05:21

+0

它不會跳入'while',但是它已經* in *的地方不會跳出。 – Tigran 2012-04-28 19:10:30

+0

噢,好的!非常感謝你:) – YuNo 2012-04-28 19:14:32

5

你並不需要一個while循環也不是temp變量,讓遞歸爲你做的工作:

public void displayTree(Node root) 
{ 
    if(root == null) return; 

    displayTree(root.left); 
    System.Console.Write(root.data + " "); 
    displayTree(root.right); 
} 
+0

是的,我後來以相同的方式糾正它。謝謝:) – YuNo 2012-04-28 19:05:39

0

溫度在開始時設置爲root,並且它的價值不會改變

怎麼樣重寫你的功能

public void displayTree(Node root) 
{ 
    if (root == null) 
     return; 
    displayTree(root.left); 
    Console.Write(...); 
    displayTree(root.right); 
} 
+0

它從循環內部改變時,函數displayTree()被有效地稱爲替換root的值爲temp.left或temp.right。 – YuNo 2012-04-28 19:07:24

0

試試這個

 public void displayTree(Node root) 
    { 
     Node temp; 
     temp = root; 

     if (temp != null) 
     { 
      displayTree(temp.left); 
      Console.WriteLine(temp.data + " "); 
      displayTree(temp.right); 

     } 
    } 
0

我只是在想,你也可以使用遞歸的add函數。它可能看起來像這樣

 private void Add(BinaryTree node, ref BinaryTree rootNode) 
    { 
     if (rootNode == null) 
     { 
      rootNode = node; 
     } 
     if (node.value > rootNode.value) 
     { 
      Add(node, ref rootNode.right); 
     } 
     if (node.value < rootNode.value) 
     { 

     Add(node, ref rootNode.left); 
     } 
    }