Рекурсивная вставка в двоичное дерево
Почему переменные-члены 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