Java数据结构和算法 (二) 二叉排序树

一、二叉树简介

在数据结构中,对于有序数组来说查找很快,但是插入和删除慢,因为插入和删除需要先找到指定的位置,后面所有的元素都要移动一个位置,为插入腾出一个位置或补上被删除的那个位置; 而对于链表来说,插入和删除快,但是查找很慢,插入和删除只要更改一下元素的引用值即可,而查找每次都要从头开始遍历直到找到目标元素为止。那么有没有一种数据结构能够同时具备查找、插入、删除都快的呢?所以有了树的诞生!

树结构有很多种,这里主要讲讲常见的二叉树。二叉树特征:树的每个节点最多有两个子节点。如下图所示:

在上图中,A是根节点,B是A的左节点,C是A的右节点,BDE是A的左子树,CF是A的右子树

 

二、二叉排序树简介

在二叉树中,有一种树叫二叉排序树,又名二叉搜索树和二叉查找树,顾名思义就是一种有顺序的二叉树。本文主要讲解二叉排序树的相关知识。二叉排序树的要求是:如果一个节点存在左子树,那么左子树中的所有节点的值都比此节点的值小;同样,如果一个节点存在右子树,右子树中的所有节点的值都比此节点的值大。从二叉排序树的排序规律来看,树的左边的值不断变小,树的右边的值不断变大。二叉排序树的结构图示例如下:

 

 

三、时间复杂度分析

二分法的查找过程是,在一个有序的序列中,每次都会选择有效范围中间位置的元素作判断,即每次判断后,都可以排除近一半的元素,直到查找到目标元素或返回不存在,所以 n 个有序元素构成的序列,查找的时间复杂度为 O(log 2 n)

       二叉排序树的查找,最好的时间复杂度和二分法一样,当二叉排序树为完成二叉树的时候,即整个树表现为左右对称的情况下,每次比较根节点的时候才能排除一半的元素,最好的查找时间才能达到O(log 2 n),最坏情况为当二叉排序树相当于一个链表的情况,即树的每层都只有一个节点的时候,这就表现为一个排序好的单链表,所以查找时间复杂度为O(n)

综上所述,二叉排序树的查找时间复杂度为O(log 2 n)~O(n),因为插入和删除首先都是基于查找实现的,它们的时间复杂度跟查找时间复杂度一样

四、如何实现二叉排序树

二叉排序树作为一种数据结构,那么它的增删改查又是如何实现的?下面我们就来看看

首先定义一个二叉树节点的类如下:

public class Node {

    private Object data;    //节点数据
    private Node leftChild; //左子节点的引用
    private Node rightChild; //右子节点的引用

    //打印节点内容
    public void display() {
        System.out.println(data);
    }

    public Node(Object data) {
        this.data = data;
    }
}

下面是二叉排序树相关的接口

public interface Tree {

    //查找节点
    public Node find(int key);
    //插入新节点
    public boolean insert(int data);

    //中序遍历
    public void infixOrder(Node current);
    //前序遍历
    public void preOrder(Node current);
    //后序遍历
    public void postOrder(Node current);

    //查找最大值
    public Node findMax();
    //查找最小值
    public Node findMin();

    //删除节点
    public boolean delete(int key);

    //......

}<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值