对二叉搜索树的浅理解(学习中)

**

对二叉搜索树的浅理解(学习中)

二叉搜索树

  • 插入某一条数据:

    # 找不到就创建新的顶点
    if insertion point is found
    # 如果插入的数据大于或者小于比对的数据
    if value to be inserted < this key
    	go left
    else go right
    

在这里插入图片描述

  • 插入一个数据(以25为例)

    • 将25与15比较---->25大于15,所以向右
    • 将25与50比较---->25小于50,所以向左
    • 将25与23比较---->25大于23,所以向右插入25
  • !!!手动高亮注意!!!

    • 本二叉树是平衡二叉树(AVL)
    • 就是插入数据的时候需要考虑树是否能保持平衡(左右子树的高度差值不能超过1即为平衡)
    • 如果不平衡的话要进行节点旋转来调整成为平衡状态
    • 后面接下来我会重点学习这个,这里只是举个浅显的插入例子而已!!!
  • 搜索一条数据:

    # 如果找不到数据
    if this == null
    	return null
    # 找到了数据
    else if this key == search value
    	return this
    # 搜索数据的判断
    else if this key < search value
    	search right
    else search left
    
  • 后继

    1. 二叉树中序遍历的序列中,某个结点紧随的那个结点,比如下图中:
      在这里插入图片描述

    2. 快速寻找当前节点(point)的后继结点:

      ​ ①. 如果point节点有右子树, 那么就是右子树上最左的结点,例如图中节点6的右子树的最左节点是7; 50的右子树最左节点是71, 15的右子树最左节点是23等.

      ​ ②. 如果point节点没有右子树, 那么也分两种情况:

      ​ a.看point节点是否为它父节点的左孩子(左面的子节点), 如果是,那么它的父亲就是它的后继, 如 4的后继为6, 23的后继为50等.

      ​ b.如果ponit为父节点的右孩子(右边的子节点), 那么它会以父节点开始出发, 往上寻找, 直到找到某个节点是其父节点的左子节点时,那么该某节点的父节点为point的后继. 如: 5的后继为6, 7的后继为15等.

      if this.right != null return findMin(this.right)
      else
      	p = this.parent, T = this
          while(P != null && T ==p.right)
          	T = p, p = T.parent
      如果p等于null返回-1
      否则返回p
      
  • 前驱

    1. 前驱的寻找可以参考后继

      ①. 如果point节点有左子树, 那么就是左子树上最右的节点,例如图中节点50的左子树既是它的最右节点23; 6的左子树最右节点是5; 15的左子树最右节点是7等.

      ②. 如果point节点没有左子树, 那么也分两种情况:

      ​ a.看point节点是否为其父节点的右孩子(右面的子节点), 如果是,那么它的父亲就是它的前驱, 如5的前驱为4, 71的前驱为50等.

      ​ b.如果ponit为其父节点的左孩子(左边的子节点), 那么它会以父节点开始出发, 往上寻找, 直到找到某个节点是其父节点的右子节点时,那么这个节点的父节点为point的前驱. 如: 23的前驱为15.

      if this.left != null return findMax(this.left)
      else
      	p = this.parent, T = this
          while(p != null && T == p.left)
          	T = p, p = T.parent
      如果p等于null返回-1
      否则返回P
      
  • 中序遍历

    如果这是null

    返回

    inOrder(left)

    访问这个, 然后inOrder(right)

    上图中序遍历结果是: 4, 5, 6, 7, 15, 23, 50, 71

  • 删除

    • 以刚插入还热乎的25为例(此节点没有子节点)

      1. 搜索并删除节点25
      2. 节点25没有子节点,它是叶节点
      3. 删除叶节点25
      4. 此处也要考虑二叉树的平衡!!!
      5. 所以这里也先简单的删除一下,平衡先往后放一放…
    • 如果要删除4节点(此节点有子节点)

      • 删除4的子节点并将其父节点连接到其右子节点
      • 删除完成
        2019.11.29
        先这样~
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值