二叉树搜索的迭代版本

时间:2009-10-01 06:51:14

标签: search binary-tree iteration

用于在二叉搜索树中搜索节点(具有值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])?

顺便说一句,如果你想知道,这是来自算法分析的着名书籍之一。

1 个答案:

答案 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的任何一方都使整个表达式为假。

如果使用的是orx ≠ NIL仍然是假的,但您需要评估另一方 - or的两边必须为{{{}} 1}}是假的。不幸的是,评估另一方取消引用NIL。糟糕!即使不是针对该问题,or也是如此(因为我们正在考虑未找到k的情况,因此树k ≠ key[x]中的key不能{ {1}})。由于x的一个(或多个)边是真的,k的计算结果为真,循环会一直持续。

在英语中,虽然可以读取:虽然还有树(or,但我们还没有找到我们正在寻找的内容(or )。