2009-10-01 6 views
3

Основной алгоритм поиска дерева для поиска узла (со значением k) в двоичном дереве поиска. 'x' обозначает узел двоичного дерева поиска.Итеративная версия поиска двоичного дерева

TREE-SEARCH (x, k) 
if x= NIL or k = key[x] 
    then return x 
if k < key[x] 
    then return TREE-SEARCH(left[x], k) 
    else return TREE-SEARCH(right[x], k) 

Итерационный Версия:

ITERATIVE-TREE-SEARCH(x, k) 
while x ≠ NIL and k ≠ key[x] 
    do if k < key[x] 
      then x ← left[x] 
      else x ← right[x] 
return x 

Если не первая линия (итерационного алгоритма) на самом деле быть в то время как (х ≠ NIL или к ≠ ключ [х]) вместо (при х ≠ NIL и k ≠ [x])?

Кстати, если вам интересно, это из одной из известных книг анализа алгоритмов.

ответ

2

Нет, это должно быть and, потому что иначе вы будете разыскивать NIL, если k не найден. Помните, что while выполняется до тех пор, пока выражение принимает значение true.

while x ≠ NIL and k ≠ key[x] 

Если х равен нулю, то выражение x ≠ NIL and k ≠ key[x] является ложным, поскольку x ≠ NIL является ложным. Любая сторона and, являющаяся ложным, делает все выражение ложным.

Если or были использованы вместо этого, x ≠ NIL все равно будет ложным, но вы должны оценить другую сторону - обе стороны в or должно быть ложным для or ложными. К сожалению, оценивая различия в другой стороне NIL. По электронной почте Ой. Даже если бы не эта проблема, k ≠ key[x] верно (потому что мы рассматриваем случай, когда k не найден, поэтому key в дереве x может быть k). Поскольку одна (или более) стороны or истинна, or оценивает значение true, и цикл продолжается навсегда.

В английском языке, что в то время можно прочитать: пока есть дерево слева (x ≠ NIL) и мы еще не нашли то, что мы ищем (k ≠ key[x]).

+0

Разве это не часть ИЛИ, что на самом деле требуется? Я имею в виду, если вы придете к той части, где x = NIL, просто выйдите и верните x, или если вы нашли ключ, снова вернитесь и распечатайте x. Вместо того, чтобы ждать, пока оба они произойдут сразу. Правильно ли я понимаю? – halluc1nati0n

+0

EDIT: О, я получаю это сейчас, цикл while всегда имеет параметр с какой-то сложной логикой: D Если мы идем к x = NIL и имеем ключевое слово OR, ключ k ≠ [x] все равно будет выполняться, и, таким образом, цикл while все равно попытается выполнить (чего мы не намерены). Это смешно, я вроде бы думаю, что мне было неловко даже задавать этот вопрос сейчас! – halluc1nati0n

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

  • Нет связанных вопросов^_^