数据结构与算法——二叉排序树(Java实现)

二叉排序树

二叉排序树(BST): 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。如果有相同的值,可以将该节点放在左子节点或者右子节点。

数据[7,3,10,12,5,1,9] 对应的二叉排序树为:

在这里插入图片描述

  • 若左子树非空,则左子树上所有结点的值均小于根结点的值。
  • 若右子树非空,则右子树上所有结点的值均大于根结点的值。
  • 左、右子树本身是二叉排序树。

二叉排序树的构建:

思路:

  1. 输入的值与根节点比较,若小于根节点则判断左子树是否为空,为空则直接放入,不为空则向下递归。
  2. 若大于根节点,判断右子树是否为空…
public void add(Nodes node){
    // 参数为空,直接返回。
    if (node == null)
        return;
    // 如果要添加的值小于根值,放在左边。
    if (node.value < this.value){
        //如果左指针为空,直接放入。
        if (this.left == null)
            this.left = node;
        else
            //如果左指针不为空,向左递归插入
            this.left.add(node);
    }else
        if (this.right == null)
            this.right = node;
        else
            this.right.add(node);
}

二叉排序树的删除:

二叉排序树的删除情况比较复杂,有三种情况需要考虑:

  1. 删除叶子节点

    1. 需要先找到要删除的节点 targetNode

    2. 找到targetNode 的父节点 parent

    3. 确定targetNode 是 parent的左子节点,还是右子节点

    4. 根据前面的情况来删除

      左子节点 parent.left = null

      右子节点 parent.right = null

  2. 删除只有一棵子树的节点

    1. 先去找到要删除的节点targetNode

    2. 找到要删除节点的父节点

    3. 确定targentNode的子节点 是左子节点还是右子节点

    4. targenNode 是parent的左子节点还是右子节点

    5. 如果targentNode 有左子节点

      1. 如果targetNode是parent 的左子节点parent.left = targentNode.left。
      2. 如果targetNode 是 parent 的右子节点 parent.right = targentNode.left
    6. 如果targentNode是右子节点。

      1. 如果targetNode是parent 的左子节点parent.left = targentNode.right。
      2. 如果targetNode 是 parent 的右子节点 parent.right = targentNode.right。

      在这里插入图片描述

  3. 删除有两颗子树的节点

    1. 需要先找到要删除的节点 targetNode
    2. 找到 targentNode 的父节点 parent
    3. 从targetNode 的右子树找到最小的节点
    4. 用临时变量,将最小节点的值保存 temp
    5. 删除最小节点。
    6. targetNode.value = temp

在这里插入图片描述

当我们删除 30 节点的时候,整个中序遍历的结果中,从 32 开始都往前移动了一位。32 是 30 的后继节点,就是比 30 大的节点中最小的节点。当某个节点存在右节点时,后继结点就是右节点中的最小值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值