Рекурсивная вставка в двоичное дерево

Почему переменные-члены LEFT и RIGHT никогда не меняются, когда я делаю рекурсивный вызов? Вот исходный код:

public class C_Nodo

{
    int dato;
    C_Nodo left;
    C_Nodo right;

    public int DATO
    {
        get { return dato; }
        set { dato = value; }
    }

    public C_Nodo LEFT
    {
        get { return this.left; }
        set { this.left= value; }
    }

    public C_Nodo RIGHT
    {
        get { return this.right; }
        set { this.right = value; }
    }

    public C_Nodo(int inf)
    {
        this.dato = inf;
        this.left = null;
        this.right = null;
    }
}

public class C_Arbol_Bin

{   
    C_Nodo root;

    public C_Arbol_Bin()
    {
        root = null;
    }

Простая вставка в корень или сделать рекурсивный вызов

    public void inserta(int dat)
    {
        if (root == null)
        {
            root = new C_Nodo(dat);
        }
        else
        {
            insert_Order(this.root, dat);
        }
    }

Здесь я делаю рекурсивную вставку упорядоченным способом, в зависимости от значения, которое содержит родительский узел, но RIGH и LEFT никогда не меняются.

    public void insert_Order(C_Nodo tree, int inf)
    {
        if (tree == null)
        {
            tree = new C_Nodo(inf);
        }
        else
        {
            if (tree.DATO > inf)
            {
                insert_Order(tree.LEFT, inf);
            }
            else
            {
                insert_Order(tree.RIGHT, inf);
            }
        }
    }
}

2 ответа

Объявите функцию как

public void insert_Order( ref C_Nodo tree, int inf );

Также, поскольку эта функция является вспомогательной функцией для функции inserta тогда это может быть объявлено как private

Что сказал Влад... В основном причина того, что части ВЛЕВО / ВПРАВО всегда равны нулю, заключается в том, что вы передаете объект ссылочного типа по значению, а затем вызываете для него новый C_Nodo() - это создает указатель на новое местоположение для ваш объект.

Таким образом, вы можете использовать решение Влада и передать его по ссылке, или вы можете изменить методы insert и insert_Order, чтобы они возвращали объект Node и сохраняли его в корневом узле:

    public void inserta(int dat)
    {
        if (root == null)
        {
            root = new C_Nodo(dat);
        }
        else
        {
            this.root = insert_Order(this.root, dat);
        }
    }

    private C_Nodo insert_Order(C_Nodo tree, int inf)
    {
        if (tree == null)
        {
            tree = new C_Nodo(inf);
        }
        else
        {
            if (tree.DATO > inf)
            {
                tree.LEFT = insert_Order(tree.LEFT, inf);
            }
            else
            {
                tree.RIGHT = insert_Order(tree.RIGHT, inf);
            }
        }

        return tree;
    }

Проверьте эту статью для получения дополнительной информации о ссылках: https://msdn.microsoft.com/en-us/library/s6938f28.aspx

Другие вопросы по тегам