二叉查找树

来源:互联网 发布:mac 如何切换中英文 编辑:程序博客网 时间:2024/06/05 15:07

二叉查找树介绍:

二叉查找树按二叉树结构组织的,具有以下性质:

对于任意节点x,其key[x] >= key[left(x)],且key[x] <= key[right(y)]

 

二叉查找树由以下基本操作:

1、  遍历(INORDER-TREE-WALK(x))

遍历可以通过递归实现:(中序遍历)

INORDER-TREE-WALK(x)

If x!=NIL

       then INORDER-TREE-WALK(left(x))

           Print key[]x]

           INORDER-TREE-WALK(left(x))

注:以上为中序遍历,也就是对于父节点、左儿子、右儿子,按照从小到大顺序排列,即左儿子、父亲、右儿子。

 

2、  查询

TREE-SEARCH(x, k)

If x==NIL or k==key[x]

   then return x

if k < key[x]

     then return TREE_SEARCH(x, k)

     else returnTREE_SEARCH(x, k)

 

3、  TREE-MINMUN

查找最小的元素,直接沿着节点的左儿子遍历到左儿子为空即可。

4、  TREE-MAXMUN

查找最大的元素,直接沿着节点的右儿子遍历到右儿子为空即可。

5、  TREE-SUCCESSOR(x)

查找后继元素,即查找到树中比key[x]的元素中最小的一个。

 REE-SUCCESSOR(x)

 If right(x) !=NIL

   Then return TREE-MINMUN(right(x))

 y = parent(x)

 while y !=NIL and x=right(y)

     do x = y

        y = parent(y)

 return y

 

注:要查找比当前元素大的最小的元素,如果有右儿子,直接取右子树的最小的元素(因为比当前元素大只能在右子树或者在某个祖先上,但是祖先要么小于当前元素(排除),要么大于当前元素的右字树所有元素一定小于该祖先,因此,如果存在右儿子那么后继元素一定在右子树)

6、  插入

TREE-INSERT(T, z)

Y = NIL

X = root(T)

While x != NIL

Do y = x

   If key[y] < key[z]

     X = right(x)

   Else  x = left(x)

   p[z]= y

   ify == NIL

     then root(T) = z

     else if key[y] > key[z]

          then left[y] = z

          else right[y] = z

 

 

7、  删除

TREE-DELTE(T, z)

   If left(z) == NILor right(z) == NIL

  then Y = z

  else y = TREE-SUCCESSOR(z)

if left(y) != NIL

    then x = left(y)

    else x = right(y)

if x != NIL

  then parent(x) = parent(y)

 

if parent(y) == NIL

  then root(T) = x

  else if y == left(parent(y))

      then left(parent(y)) = x

      else right(parent(y)) =x

 

if y != z

   then key[y] = key[z]

return y

 

注:删除过程第一步是要找到只有一个儿子或者没有儿子的节点。如果待删除的节点不多于两个儿子那么该节点就是本身要找的节点,否则需要的找到该节点的后继节点。第二步是将找的节点与待删除节点进行替换,替换的第一步在于把找到的节点的儿子找到新的父亲。

 

 

 

 

       

 

 

0 0
原创粉丝点击