二叉查找树基本实现和对重复数据的处理以及优化成为平衡二叉树

本文介绍了二叉查找树的概念、优点以及基本操作,包括节点的添加和删除。详细讨论了如何处理重复数据,通过增加count变量避免创建新节点。同时,探讨了平衡二叉查找树的重要性,展示了如何通过旋转操作来保持树的平衡,以提高查询效率。文章提供了代码实现,并举例说明了平衡调整的过程。
摘要由CSDN通过智能技术生成

1 二叉排序树概念

二叉查找树 又叫 二叉排序树,二叉搜索树。Binary Search Tree(BST)

  • 对于二叉查找树中的每一个节点如果存在左节点,左节点的值一定小于该节点的值
  • 对于二叉查找树中的每一个节点如果存在右节点,右节点的值一定大于该节点的值
  • 也就是说对于二叉查找树中的任何一个非叶子节点,左节点值小于当前节点值,右节点值大于当前节点值
  • 二叉查找树的任何一个非叶子节点的左子树中的任何一个节点的值都要小于当前节点值,右子树中的任何一个节点的值都要大于当前节点值。
  • 如果对二叉查找树进行中序遍历,可以得到一个从小到大的序列 ,所以也叫作二叉排序树

 下图所示为一棵二叉查找树

优点

  • 二叉排序树是一种比较有用的折衷方案。 
  • 数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。 
  • 链表与之相反,删除和插入元素很快,但查找很慢。 
  • 二叉排序树就既有链表的好处,也有数组的好处。 
  • 在处理大批量的动态的数据是比较有用。

 

2基本思路 

树的创建和添加:

  root为空则root设置为新添加的节点,不为空 就比较当前节点和需添加进来的节点值,若新的节点值小于当前节点则接着与左节点比较,如果当前节点的左节点为空,则将新节点设置为当前节点的左节点,左节点不为空,接着与左节点比较。。。。若新的节点值大于当前节点则接着与右节点比较,如果当前节点的右节点为空,则将新节点设置为当前节点的右节点,右节点不为空,接着比较下去。

树的删除:   分为四种情况

  1. 树只由一个根节点构成                 删除时要判断父节点为空&&左节点为空&&右节点为空
  2. 要删除的节点没有左和右节点      删除只需要将父节点的指向该节点的引用设置为null
  3. 要删除的节点只有一个节点          将要删除的节点的子节点设置为父节点相应的子节点
  4. 需要删除的节点有两个子节点      将要删除节点的右子树中的最小值节点替换要删除的节点,如果最小值节点有右节点的                                                         话,并将最小值节点的右节点设置为其父节点相应子节点   或者    将左子树中的最大值节                                                       点替换要删除的节点,如果最大值节点有左节点,并将最大值节点的左节点设置为其父节                                                       点相应的子节点。

第四种情况最小(大)节点替换被删除节点时  不仅value要被替换,count也要被替换 ,否则count值将会被保留

2代码实现

  节点类

package com.sorttree;

/**
 * @Author WYMY
 * 
 */
public class Node {
    int value;
    Node left;
    Node right;
    //如果节点重复count+1 没有重复count=0
    int count=0;

    public Node(int value) {
        this.value = value;
    }
    //节点添加 递归
    public void add(Node node) {
        if (null == node) {
            return;
        }
       //新添加的节点值小于当前节点值
        if (node.value < this.value) {
            if (this.left == null) {
                this.left = node;
            } else {
                this.le
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值