二叉搜索树

搜索比较  : 数组的搜索比较方便 ,可以直接使用下标,但是删除或者插入某些元素就比较麻烦了

                    链表  : 删除插入快,查找慢

                    二叉搜索树处理大量动态数据比较有用

二叉搜索树的基本概念:每个节点比他的左子树的任意节点大,而且比它右子树的任意节点小。二叉搜索树沿着一个路径,直到找到数据或NIL值。

基本概念:

1.根(root):树中最顶端的节点,根没有父节点。

2.子节点(child):节点所拥有子树的根节点称为该节点的子节点。

3.前驱结点:结点val值小于该节点值并且值最大的节点。

4.后继节点:节点val值大于节点val值并且值最小的节点。


二叉搜索树的寻找值得两种实现方法:

查找过程从根节点开始:如果值与节点的值相同则命中,如果不同,搜索的值比节点的值大,则进入他的右子树,比节点的值小则进入左子树,如果左边或右边的指针为空,则报告没有找到。

递归实现:

Tree_search(x,k);
if x == NIL or x.key == k:
    return x;
if k < x.key:
    return Tree_search(x.left,k)
else:
    return Tree_Search(x.right,k)

非递归迭代实现(这个比递归实现的方法效率更高)

Tree_search(x,k):
while x != NIL and k != x.key:
    if k < x.key:
        x = x.left
    else:
        x = x.right
return x

 前序遍历:61532479810

 中序遍历:12345678910

4 的前驱是3;2的前驱是1;6的前驱是5;7的后继是8,5的后继是6;2的后继是3


中序遍历一下,就知道哪个是哪个的前驱,哪个是哪个的后继了。

前驱节点:

1.若一个节点有左子树,那么该节点的前驱节点是其左子树中val值最大的节点

2.若一个节点没有左子树,那么判断该节点和其父节点的关系:

    a.该节点是其父节点的右子树,那么该节点的前驱节点即为父节点。

    b.若该节点是其父节点的左子树,那么需要沿着其父节点一直向树的顶端寻找,知道找到一个节点p,p节点是其父节点q的右孩子,那么q就是该节点的前驱节点。


后继节点:

1.若一个节点有右子树,那么该节点的后继节点是其右子树中,val值最小的节点。

2.若一个节点没有右子树:

    a.该节点是其父节点的左边孩子

    b.该节点是其父节点的右孩子

BST 插入:

当需要一个新节点时,从根节点开始,迭代或者递归向下移动直到遇到一个空的指针NIL,需要插入的值被存储在该节点的位置。


BST删除比插入复杂:

1.如果节点z没有孩子节点,那么只需要简单将其删除,并修改父节点,用NIL来代替z。

2.节点z只有一个孩子,那么僵这个孩子节点提升到z节点的位置,并修改z的父节点,用z的子节点替换z;

3.如果节点z有两个子节点,那么查找z的后继y后继一定在的右子树中,然后让那个y替换z.



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值