2015-03-06 8 views
0

Каждый узел в полном двоичном дереве может быть идентифицирован его меткой. Другими словами, обход уровня CBT означает доступ к узлам в порядке возрастания меток. Я написал функцию getPointer, чтобы вернуть узел, заданный Root и Label. Например, в полном двоичном дереве, показанном ниже, ключ имеет метку , ключ 38 имеет метку 3 и так далее.Удаление последнего узла из полного двоичного дерева

 1 
/ \ 
    2  38 
/
5 

Где я неправильно в следующем подходе? У меня есть структура узла.

node 
{ 
    rightChild 
    leftChild 
    value 
    label 
} 

C-стиле псевдокод:

 getPointer(root, label) 
    if(label == 1) return root 
    else 
    { 
     temp_node = getPointer(root,label/2); 
     child  = temp_node->left; 
     if(label == child->label) return child; 
     else      return temp_node->right; 
    } 
+0

Помимо обработки потенциально NULL детей, если ярлык, который они запрашивают, слишком велик, ваш псевдо-код выглядит для меня звуком. – jschultz410

+0

Возможно, вам захочется подумать о том, как вы можете преобразовать дерево в другую структуру, предлагая быстрый доступ к этой информации, но это другая проблема. – dfeuer

ответ

0

Я думаю, что ваш код не обрабатывает следующий сценарий:

 1 
    /\ 
    2 38 
     \ 
     5 

Вы можете просто применить BFS для этой задачи.

+0

это полное двоичное дерево. Также обход уровня последовательности означает BFS. –

+0

О, я пропустил эту часть: D. Но все же BFS можно применять. В вашем коде, кроме нулевой проверки для ребенка, он выглядит хорошо. – coolVick

+0

можем ли мы пообщаться? Проблема, к сожалению, до сих пор не решена. –

0

Если вы не проверяете, является ли ваш корень нулевым ptr. Может быть случай, когда уровень не равен 1, но вы передаете null ptr своим методам. Например, если во время рекурсии, когда правильный ребенок равен нулю.

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