объект c # теряет ссылку при удалении из списка - PullRequest
0 голосов
/ 08 декабря 2010

У меня очень странная проблема. По сути, я создал класс под названием TreeNode, который представляет узел в дереве. Затем я создаю дерево, добавляя все узлы в список.

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;
    }
}

Так что, если я поставлю точку останова сразу после создания дерева и наведу курсор мыши на список в Visual Studio, я смогу увидеть структуру дерева - все ссылки отлично работают от корня до листьев.

Если, однако, я делаю следующее:

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

пожалуйста, обратите внимание:

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

, который возвращает корневой узел - и снова наведите указатель мыши. Я могу перейти на один уровень ниже (т. Е. Левый или правый потомок), но после этого у этих детей нет ссылок на своих потомков.

Мне интересно, теряю ли я ссылку в памяти на другие узлы в списке, поскольку тестовый узел не является частью списка?

Любая помощь будет принята с благодарностью.

Спасибо Том

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

вы уверены, что у вас его нет (обратите внимание, что в вашем коде нет пробела между новым и деревом)

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

, который создаст новый пустой массив дерева (возможно, не того, что вы хотели), и оставитВаше оригинальное дерево не имеет рутов и недоступно.

Можете ли вы убедиться, что ваш код правильный, пожалуйста?

0 голосов
/ 08 декабря 2010

Кажется, что я нашел проблему - я не правильно обновил некоторые родительские узлы с их соответствующими дочерними узлами - проблема решена.

Спасибо за вашу помощь, Том

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...