【二叉排序树详解】二叉排序树的创建、节点查找和删除-数据结构08

本文详细介绍了二叉排序树的概念、特点,并提供了在Java中实现二叉排序树增删查改的代码示例,包括如何进行中序遍历和删除不同情况下的节点。

二叉排序树(BST)

1. 简介

  • 为什么使用二叉排序树

    对于顺序存储的二叉树:不排序-查找/删除/插入困难

    ​ 排序-删除/插入困难

    链式存储的二叉树:是否排序-都会查找困难(每次都需要从头结点开始找)

    而二叉排序树就解决了以上问题

  • 什么是二叉排序树

    百度百科定义:二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。在一般情况下,查询效率比链表结构要高。

    要求: 对于二叉树中的任何一个非叶子结点,要求左子结点比当前结点值小,右子结点比当前结点值大。

举例:

需求-将如下数字 {7,3,11,13,5,1,9} 变成一颗二叉排序树

实现思路:将第一个数作为根节点,依次比较,比它大的放右子节点,小的放子节点

​ 如果子节点还有子节点,那么就需要接着往下比较,直到找到一个合适的位置,如下图

在这里插入图片描述

如果我们想插入任意一个数字,比如插入10

比较过程:和7比较->和11比较->和9比较->插入到9的右子节点

2. 代码实现

2.1 涉及的操作

add() 增加结点-使其变成一颗二叉排序树

midShow() 中序遍历输出二叉排序树-使用中序遍历刚好能够输出排序好的序列

search() 查找节点-输入value,如果找到返回value

delete() 删除节点-只删除传入的目标节点,其他结点不删除并且删除后还是一颗二叉排序树

情况一: 删除的节点是叶子结点

​ 只需切断父节点和删除节点的联系即可

情况二: 删除节点有一颗子树:左子树或右子树

​ 需要用删除节点的子树替换掉目标结点, 如:删除节点是left,它的子树是left parent.left=target.left

情况三: 删除节点有两棵子树,左子树和右子树

​ 删除节点的左子树中结点值都小于删除节点,右子树都大于删除节点

​ 要删除目标节点,我们要找到可以替代它位置的节点,而这个结点就是左子树最大的或者右子树最小的

​ Way1:删除目标节点左子树中最大的结点并存储它的value,用value替换掉目标节点value

​ Way2:删除目标节点右子树中最小的结点并存储它的value,用value替换掉目标节点value

​ (以下我们采用方式二)

2.2 代码

BinarySortTree.java

//二叉排序树
public class BinarySortTree {
   
   
    Node root;
    //添加节点
    public void add(Node node){
   
   
        //第一次进入方法时,是一颗空树,设置为根节点root
        if(root==null){
   
   
            root=node;
        }else{
   
   
            //调用节点的add方法
            root.add(node);
        }
    }
    //中序遍历,输出二叉排序树结果
    public void midShow(){
   
   
        if(root!=null){
   
   
            root.midShow(root);
        }
    }
    //查找节点
    public Node search(int value){
   
   
        if(root!=null){
   
   
            return root.search(value);
        }
        return null;
    }
    //删除结点
    public void delete(int value){
   
   
        if(root==null){
   
   
            return;
        }
        root.delete(value);
    }
    //查找父节点
    public Node SearchParent(int value){
   
   
        if(root!=null){
   
   
            return root.searchParent(value);
        }
        return null;
    }
}

Node.java

public class Node {
   
   
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kygo Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值