2014-01-02 7 views
0

Я изучал двоичные деревья. И я нашел этот код для вставки узла в дерево. Здесь «root» - это указательная переменная типа структуры в классе «TreeType» как «частный член».Изменение корневого указателя двоичного дерева поиска

В этой функции «корень» передается по ссылке, поэтому в функции «Вставить» любые изменения в «дереве» также приводят к изменению «корня». Если снова вызвать функцию «Вставить», корень будет указывать на последний узел или он укажет на первый узел? Итак, по моему мнению, поскольку он будет указывать на последний узел, функция вставки больше не будет работать. Может ли кто-нибудь помочь в этом?

void Insert(TreeNode*& tree, ItemType item); 

void TreeType::InsertItem(ItemType item) 
// Calls the recursive function Insert to insert item into tree. 
{ 
Insert(root, item); 
} 
void Insert(TreeNode*& tree, ItemType item) 
// Inserts item into tree. 
// Post: item is in tree; search property is maintained. 
{ 
if (tree == NULL) 
{// Insertion place found. 
tree = new TreeNode; 
tree->right = NULL; 
tree->left = NULL; 
tree->info = item; 
} 
else if (item < tree->info) 
Insert(tree->left, item); // Insert in left subtree. 
else 
Insert(tree->right, item); // Insert in right subtree. 
} 
+0

Насколько я вижу, это должно работать нормально, за исключением случая, когда у вас есть дубликат. Изменения в дереве НЕ будут влиять на корень, как вы сказали. Я не уверен, что проблема у вас есть –

+0

Но попутно по ссылке значение источника также изменяется правильно. Тогда почему не здесь? Можете ли вы уточнить? –

+0

void Insert (TreeNode * & tree, ItemType item); из-за TreeNode * & tree –

ответ

1

Единственный корень времени получает изменилось, если дерево пусто, так что это будет по-прежнему указывают на «первый узел» есть такая существует в первую очередь. Во всех остальных случаях «корень», который изменяется, является либо левым, либо правым дочерним указателем узла.

+0

Да, предположим, что он продолжает указывать на правильный ребенок и вставляет в нужное место. Тогда к этому времени корневой указатель имеет другое значение, чем он должен был иметь. Поэтому, если попытаться вставить снова, будет ли поиск начинаться с указателя, в который был вставлен элемент, или с начала –

+0

ТОЛЬКО время, когда корень изменяется, когда дерево пустое; любой рекурсивный вызов НЕ меняет корень, а является одним из внутренних указателей. –

1

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

void Insert(TreeNode*& tree, ItemType item) 
{ 
if (tree == NULL) 
{ 
    // Insertion place found. 
    tree = new TreeNode; 
    tree->right = NULL; 
    tree->left = NULL; 
    tree->info = item; 
    return; 
} 

if (item < tree->info) { 
    if(tree->left == NULL) { 
     tree->left = new TreeNode; 
    } else { 
     Insert(tree->left, item); // Insert in left subtree. 
    } 
} else { 
    if(tree->right == NULL) { 
     tree->right = new TreeNode; 
    } else { 
     Insert(tree->right, item); // Insert in right subtree. 
    } 
} 
} 

Как вы можете видеть, когда дерево пусто, root=NULL. Поэтому в первый раз он войдет в первый пункт if. Затем будет создан корень, и поскольку указатель передается по ссылке, это означает, что корневой узел будет создан в куче и возвращен из функции. Новое значение корневого указателя будет передано вызывающему через ссылку. Таким образом, значение корневого указателя останется в памяти кучи. По мере последующего построения дерева все дочерние узлы будут построены впоследствии, не затрагивая корневой узел.

+0

Но у меня все еще есть путаница. В функции swap (int & a, int & b) изменения значений a и b отражаются в функции, из которой вызывается своп. Тогда почему не в указанном выше случае в дереве. –

+1

Это потому, что, когда дерево пуст, корневой узел создается в куче и да, его значение (указатель на корневой узел) изменяется из-за «нового» в первом блоке if. Но корневой узел назначается только один раз после первого вызова функции. После этого все последующие дочерние узлы назначаются рекурсией, и они не влияют на корневой узел. Подумайте, как работает рекурсия. – tonga

Смежные вопросы