二叉查找树

二叉查找树介绍:

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

对于任意节点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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值