2010-12-08 58 views
0

J'ai un problème très étrange. Fondamentalement, j'ai créé une classe appelée TreeNode qui représente un nœud dans un arbre. Je crée ensuite l'arbre en ajoutant tous les nœuds à une liste.C# objet perd la référence lorsqu'il est retiré de la liste

class TreeNode 
{ 

    private TreeNode parent, lChild, rChild; 
    private int key, val; 

    public int Key 
    { 
     get { return key; } 
     set { key = value; } 
    } 
    public int Val 
    { 
     get { return val; } 
     set { val = value; } 
    } 

    public TreeNode Parent 
    { 
     get { return parent; } 
     set { parent = value; } 
    } 
    public TreeNode LChild 
    { 
     get { return lChild; } 
    } 
    public TreeNode RChild 
    { 
     get { return rChild; } 
    } 

    public TreeNode(int k, int v) 
    { 
     key = k; 
     val = v; 
    } 

    public void SetChild(TreeNode leftChild, TreeNode rightChild) 
    { 
     this.lChild = leftChild; 
     this.rChild = rightChild; 

    } 

    public bool isLeaf() 
    { 
     if (this.lChild == null && this.rChild == null) 
     { 
      return true; 
     } else 
     { 
      return false; 
     } 
    } 

    public bool isParent() 
    { 
     if (this.parent == null) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public void SetParent(TreeNode Parent) 
    { 
     this.parent = Parent; 
    } 
} 

Donc, si je mets un point d'arrêt juste après la création de l'arbre et survolez la liste dans Visual Studio, je peux voir la structure de l'arbre - avec toutes les références fonctionnent parfaitement de la racine jusqu'aux feuilles .

Si toutefois je fais ce qui suit:

TreeNode test = newTree[newTree.Count - 1]; 

s'il vous plaît noter:

private List<TreeNode> newTree = new List<TreeNode>(); 

qui retourne le nœud racine - et survolez encore, je peux faire un niveau plus bas (l'enfant gauche ou à droite enfant) mais ces enfants n'ont pas de références pour leurs enfants après cela. Je me demande si je perds la référence en mémoire pour les autres nœuds de la liste car le nœud de test ne fait pas partie de la liste?

Toute aide serait grandement appréciée.

Merci Tom

Répondre

1

-vous sûr que vous n'avez pas (note pas d'espace entre le nouveau et l'arbre dans votre code)

TreeNode test = new Tree[newTree.Count - 1]; 

Ce qui créerait un nouveau tableau vide d'arbre (probablement pas ce que vous vouliez), et laissez votre arbre d'origine non-rooté et inaccessible. Pouvez-vous vous assurer que votre code est correct, s'il vous plaît?

+0

C'était je pense aussi. –

+0

Salut, je m'excuse de ne pas être plus clair ... 'newtree' est une liste de TreeNode - convention de nommage stupide je sais, j'étais juste paresseux. donc le code est correct, merci – TomP89

0

On dirait que j'ai trouvé le problème - je ne mettais pas correctement à jour certains des nœuds parents avec leurs nœuds enfants - le problème a été résolu.

Merci pour votre aide Tom