用于在二叉搜索树中搜索节点(具有值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
迭代算法的第一行(不应该是while)(x≠NIL或k≠key [x])而不是(而x≠NIL且k≠key [x])?
顺便说一句,如果你想知道,这是来自算法分析的着名书籍之一。
答案 0 :(得分:2)
不,它必须是and
,否则如果找不到k
,您将取消引用NIL。请记住,只要表达式求值为true,while
就会执行。
while x ≠ NIL and k ≠ key[x]
如果x是NIL,则表达式x ≠ NIL and k ≠ key[x]
为false,因为x ≠ NIL
为false。 and
为false的任何一方都使整个表达式为假。
如果使用的是or
,x ≠ NIL
仍然是假的,但您需要评估另一方 - or
的两边必须为{{{}} 1}}是假的。不幸的是,评估另一方取消引用NIL。糟糕!即使不是针对该问题,or
也是如此(因为我们正在考虑未找到k的情况,因此树k ≠ key[x]
中的key
不能{ {1}})。由于x
的一个(或多个)边是真的,k
的计算结果为真,循环会一直持续。
在英语中,虽然可以读取:虽然还有树(or
)和,但我们还没有找到我们正在寻找的内容(or
)。