2012-07-24 36 views
0

我在C#中做了一個簡單的程序來在二叉樹中添加一個節點。 我有一個對象字段'根'來保存主父節點。這樣每次我添加一個節點時,我都會通過檢索父節點中的數據從樹中遍歷一個節點。對象在沒有任何代理的情況下自動更新

這裏是我的代碼

public class BTNode 
    { 
     public int Value { get; set; }   
     public BTNode Left { get; set; } 
     public BTNode Right { get; set; } 
     public BTNode Root { get; set; } 
    } 


public class BinaryTree 
    { 
     public BinaryTree() 
     { 
      size = 0; 
      Root = null; //To hold the main Parent Node 
     } 
     int size; 
     object Root; 

     public void AddNode(int value) 
     { 
      BTNode NewNode = new BTNode(); 
      if (Root != null) 
      { 
       NewNode = (BTNode)Root; //If tree exists, Get the Root Node 
      } 

      while (NewNode.Root != null) 
      { 
       if (value < NewNode.Value) 
       { 
        NewNode.Root = NewNode.Left; 
       } 
       else if (value > NewNode.Value) 
       { 
        NewNode.Root = NewNode.Right; 
       } 
      } 

      size++; 
      NewNode.Value = value; //OBJECT 'ROOT' GETTING UPDATED AT THIS POINT 
      NewNode.Root = NewNode; //self pointer 
      NewNode.Left = null; 
      NewNode.Right = null; 

      if (size == 1) 
      { 
       Root = (object) NewNode; //if this is the Parent Node(First Node) 
      }        //then update the Root to be the parent Node 
     } 
    } 

我想抱着二叉樹的唯一父節點「根」。我只想要執行的最後一行時,大小= 1,即如果它的第一個節點的樹,但無論我做什麼,Root都會針對每個節點進行更新。我正在努力知道爲什麼會發生這種情況,請幫助我。我在這裏錯過了任何的合作,邏輯。

+0

當你說'NewNode.Root = NewNode.Left;'你不是重新分配每個節點的'Root'嗎?我認爲相反,你只是想說'NewNode = NewNode.Left;' – mellamokb 2012-07-24 13:46:39

+0

我實際上創建了NewNode.Root,以便我可以將它用作參考或指向其子節點的指針。我想我可以像你說的那樣編碼。我不需要BTNode類中的Root屬性。謝謝。 – Rasm 2012-07-24 15:21:54

回答

1
  1. 您的Root屬性可以輸入到BTNode。這樣,您就不需要投它
  2. NewNode = (BTNode)Root;越來越根節點參考。您對NewNode所做的任何更改都會影響根節點。您是否知道值類型參考類型
  3. 我不明白你爲什麼要去(檢查的Root),而不是(檢查左或右節點)。

檢查此解決方案,請。它使用一個簡單的遞歸方法來放置新的節點:

public class BinaryTree 
    { 
     public BinaryTree() 
     { 
      size = 0; 
      Root = null; //To hold the main Parent Node 
     } 
     int size; 
     BTNode Root; 

     public void AddNode(int value) 
     { 
      size++; 
      BTNode NewNode = new BTNode() 
      { 
       Value = value 
      }; 

      if (this.Root == null) 
      { 
       this.Root = NewNode; 
       return; 
      } 

      this.PlaceNewNode(this.Root, NewNode); 
     } 

     public void PlaceNewNode(BTNode RootNode, BTNode NewNode) 
     { 
      if (NewNode.Value < RootNode.Value) 
      { 
       if (RootNode.Left != null) 
       { 
        PlaceNewNode(RootNode.Left, NewNode); 
       } 
       else 
       { 
        RootNode.Left = NewNode; 
        return; 
       } 
      } 
      else 
      { 
       if (RootNode.Right != null) 
       { 
        PlaceNewNode(RootNode.Right, NewNode); 
       } 
       else 
       { 
        RootNode.Right = NewNode; 
        return; 
       } 
      } 
     } 
    } 

希望這有助於。

Regards

+0

謝謝安德烈。我實際上首先嚐試了BTNode類型的根,然後將其更改爲一個對象。 我需要根節點,因爲我想要添加到樹中的新節點從樹的根進行比較,而不是將它與最後插入的節點進行比較,所以每次添加一個節點時,我都會從根並在適當的地方插入節點。感謝您的回答,現在就馬上進行檢查。 – Rasm 2012-07-24 14:54:07

+0

我明白,修改代碼非常有用,所以你可以保留根的引用。你最歡迎 – 2012-07-24 15:51:55

+0

*容易*,而不是*使用* – 2012-07-24 16:00:00

0

我覺得你對Root這個詞的用法很混亂。一棵樹只能有一個根對象。節點對象可以有一個父節點(除非它是根節點)。樹結構很好地適用於遞歸代碼。

下面是一些代碼,它類似於什麼安德烈公佈。

public class BTNode 
{ 
    public BTNode() { } 
    public BTNode(int value) { Value = value; } 

    public int Value { get; set; } 
    public BTNode Left { get; set; } 
    public BTNode Right { get; set; } 
    public BTNode Parent { get; set; } 
} 

public class BinaryTree 
{ 
    public BinaryTree() { } 

    public BTNode Root { get; private set; } 
    public int Size { get; private set; } 

    public void AddNode(int value) 
    { 
     BTNode insertNode = new BTNode(value); 
     if (Root == null) 
      Root = insertNode; 
     else 
      AddNodeToTree(Root, insertNode); 
     Size++; 
    } 

    private void AddNodeToTree(BTNode parentNode, BTNode insertNode) 
    { 
     if (insertNode.Value >= parentNode.Value) 
     { 
      if (parentNode.Right != null) 
       AddNodeToTree(parentNode.Right, insertNode); 
      else 
      { 
       parentNode.Right = insertNode; 
       insertNode.Parent = parentNode; 
      } 
     } 
     else 
     { 
      if (parentNode.Left != null) 
       AddNodeToTree(parentNode.Left, insertNode); 
      else 
      { 
       parentNode.Left = insertNode; 
       insertNode.Parent = parentNode; 
      } 
     } 
    } 

    public BTNode FindNode(int value) 
    { 
     return FindNode(Root, value); 
    } 

    public BTNode FindNode(BTNode parent, int value) 
    { 
     BTNode node = null; 
     if (parent != null) 
     { 
      if (parent.Value == value) 
       node = parent; 
      else 
      { 
       if (parent.Value < value) 
        node = FindNode(parent.Right, value); 
       else 
        node = FindNode(parent.Left, value); 
      } 
     } 
     return node; 
    } 
} 
+0

謝謝mdm。我想存儲二叉樹的根,並在插入新節點時使用它來遍歷樹。感謝您的解決方案。你的兩個代碼都可以工作。 我應該爲BTNode類中的屬性root使用另一個名稱。 – Rasm 2012-07-24 15:17:58

相關問題