二叉查找树

二叉查找树(Binary Search Tree)也叫排序树或有序树或搜索树,它是为实现快速查找而生。二叉查找树的左子树的节点都小于它的父节点,右子树中的节点都大于它的父节点,因此若按中序遍历,要进行从小到大的排序。

无论是空树,还是二叉查找树,都有严格的定义:

若左子树不空,则左树上所有节点的值均小于它的根节点的值;若右子树不空,则右树上所有节点的值均小于它的根节点的值;左、右树也分别为二叉查找树,没有键值相等的节点。

二叉树查找的时间复杂度最坏的情况下类似链表为O(n),而在一般平衡状态下一般都会接近O(logn),从时间复杂度来看是一种比较出色的查找的数据结构。而在插入操作中由于只能插入在叶子上也类似查找的时间复杂度。但是二叉查找树在删除时要分为三种情况:

二叉查找树删除时的三种情况

1、被删除结点没有子结点:直接将其父结点对应的左子树或右子树设置为 null。如删除结点 E 时,pp.left = null 或 pp.right = null。

2、被删除结点只有一个子结点:直接将其父结点指向被删除结点的左子树或右子树。如删除结点 D 时,pp.left = p.left 或 pp.right = p.right。

3、被删除结点有两个子结点:此时删除比较复杂,需要先从被删除结点的右子树查找最小值结点 p2 赋值给被删除结点。这样就变成删除这个右子树查找最小值结点 p2 的问题,同第一种情况完全一样。如删除结点 B 时,需要在其右子树中查找一个最小的值结点 F,将 B 对应结点的值替换成 F,然后再删除 F。

二叉查找树的时间复杂度都和树的高度息息相关,也就是 O(height)。如果满足平衡二叉树时树高度为 logn,如果退化成链表时树高度为 n,而深度(高度)为k的二叉树至多有2^k-1个结点。

用Java实现二叉树的顺序存储

1、对于完全二叉树,若从上往下,从左到右,则编号为i的结点,其左孩子编号必定为2i,其右边孩子编号必定为2i+1,其双亲结点编号必定为i/2。

2、第i层有2^(i-1)个结点(i为深度)。

3、对于任何一棵二叉树,若2度的结点数有n2个,则叶子树n0必定为n2+1(即n0=n2+1)。
实现代码:

初始化定义深度,长度以及存储数组

构造无参构造器,传入深度参数的构造器,以及传入参数深度和根结点的构造器

添加初始化结点

判断二叉树是否为空

返回指定结点的值

返回指定结点的父节点

添加指定结点的左节点

添加指定结点的右节点

返回指定结点的左节点

返回指定结点的右节点

在主函数中实现操作并输出结果

运行结果截图

二叉查找树对比散列表(哈希表)

在不考虑哈希冲突的情况下散列表的插入、删除、查找的时间复杂度都是 O(1),而二叉查找树在平衡情况下为O(logn)。那么二叉查找树的优势相对于散列表在哪里呢?

1、散列表有一个最明显的问题就是其中的数据均为无序数据,如果我们对一组数据的顺序有要求时,我们要对散列表中的顺序进行排列,而二叉查找树法仅需要进行中序遍历就可获得有序数据。

2、散列表扩容耗时很多,而且当遇到散列冲突时,性能不稳定。而尽管二叉查找树的性能不稳定,但是在工程中,我们最常用的平衡二叉查找树的性能非常稳定,时间复杂度稳定在 O(logn)。

3、尽管散列表的查找等操作的时间复杂度是常量级的,但因为哈希冲突的存在,这个常量不一定比 logn 小,所以实际的查找速度可能不一定比 O(logn) 快。加上哈希函数的耗时,也不一定就比平衡二叉查找树的效率高。

4、散列表的构造比二叉查找树要复杂,需要考虑的东西很多。比如散列函数的设计、冲突解决办法、扩缩容等。平衡二叉查找树只需要考虑平衡性这一个问题,而且这个问题的解决方案比较成熟、固定。

所以我们面对一个数据大小不太大不容易发生哈希冲突且对速度有高要求的问题时,可以采用散列表。但是在解决对速度稳定性有高要求的问题时,便可以考虑使用二叉查找树这个稳定的解决方案。

文章转自:小组19级成员--程天翼

二叉树初始化_Java实现二叉树相关推荐

  1. java二叉树算法_java构建二叉树算法

    展开全部 //********************************************************************************************* ...

  2. java二叉树怎么初始化_java实现二叉树常见操作

    packagecom.xk.test.struct.newp;importjava.util.ArrayList;importjava.util.LinkedList;importjava.util. ...

  3. java二叉树生成器_JAVA实现二叉树生成

    给定某二叉树三序遍历中的两个,我们即可以通过生成该二叉树,并遍历的方法,求出剩下的一序,具体代码如下package Tree; import java.io.BufferedInputStream; ...

  4. java 二叉树 遍历_JAVA实现二叉树(简易版--实现了二叉树的各种遍历)

    1 packagetree;2 3 importjava.util.ArrayDeque;4 importjava.util.ArrayList;5 importjava.util.List;6 im ...

  5. Java 二叉树 前序_java实现二叉树前序中序后序层次遍历

    public class BinarySearhTree { // 属性 private TreeNode root; //根节点 private int size; public void add( ...

  6. java两二叉树相同_java – 最有效的方式来测试两个二叉树的相等性

    您将如何在Java中实现二叉树节点类和二叉树类以支持最有效(从运行时角度)相等的检查方法(也必须实现): boolean equal(Node root1, Node root2) {} 要么 boo ...

  7. java 递归深度优先遍历_Java基础 - 二叉树的遍历之深度优先遍历(递归遍历)

    package com.yc.test; import java.util.ArrayList; import java.util.List; import com.yc.tree.ThreeLink ...

  8. java 文件遍历排序_Java的二叉树排序以及遍历文件展示文本格式的文件树

    Java二叉树排序算法排序二叉树的描述也是一个递归的描述, 所以排序二叉树的构造自然也用递归的: 排序二叉树的3个特征: 1:当前node的所有左孩子的值都小于当前node的值: 2:当前node的所 ...

  9. java 二叉树特点_java学习笔记-二叉树、平衡二叉树(AVL)、红黑二叉树(十)

    各种树 标签:数据结构范畴 二叉树的定义: 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为 ...

最新文章

  1. Java学习笔记07--日期操作类
  2. eclipse断点调试 出现Source not found
  3. django中序列化器字段参数、关联字段
  4. python最基本的规则是关键字吗,Python 关键字
  5. 计算机视觉CV算法分类,计算机视觉(CV)的算法有哪些,具体都有哪些特点?...
  6. 阅读总结:如何在生产中成功运用Docker
  7. SpringMVC 日期类型转换
  8. 叶脊网络拓扑(leaf-spine)
  9. poj2965--枚举专题 (算法巧妙)
  10. Unity基础知识之协程
  11. STM32CubeMX 安装提示需要java环境(1.8.0_45)
  12. Android 自定义控件之---3D画廊
  13. 阳性水草与阴性水草的区分
  14. NVMe Protect Information
  15. discuz X程序目录和文件列表 详细中文说明
  16. Centos7 搭建LNMP架构服务器实战
  17. 交叉编译arm版linaro-1.13.1-4.7-2013.03
  18. HCIA网络课程第一周作业
  19. 从零构建知识图谱-第二章知识图谱技术体系
  20. Postgis源码编译

热门文章

  1. Matplotlib实例教程(十五) 3D散点图
  2. LeetCode-剑指 Offer 15. 二进制中1的个数
  3. redis高可用原理及demo
  4. elasticSearch6源码分析(7)node
  5. 好技术领导和差技术领导区别在哪里--转
  6. spring security源码分析之core包
  7. 多核学习在图像分类中的应用
  8. Chromium:编译,运行
  9. Oracle-UNDO表空间解读
  10. vue 中watch函数名_vue中避免使用函数来绑定依赖