二叉查找树定义

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sorted binary tree),是指一棵空树或者具有下列性质的二叉树:

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

二叉查找树相比于其他数据结构的优势在于查找、插入的时间复杂度较低。为O(log n)。

三层二叉查找树

二叉查找树的操作主要是运用的递归的思想,可操作的Object类必须继承了Comparable接口,个人实现查找树主要是参考了《数据结构与算法分析》这本书。因为遍历涉及到三种遍历方式,所以届时单独开一篇。

树的结点定义

 private static class BinaryNode<T>{
BinaryNode(T theElement) {
this(theElement,null,null);
}
BinaryNode(T theElement,BinaryNode<T> lt,BinaryNode<T> rt) {
element=theElement;
left=lt;
right=rt;
}
T element;//根节点
BinaryNode<T> left;//左子树
BinaryNode<T> right;//右子树
}

contains方法

 private boolean contains(T x,BinaryNode<T> t){
if(t==null)
return false;
int compareResult=x.compareTo(t.element);
if(compareResult<0)
return contains(x,t.left); //递归
else if (compareResult>0) {
return contains(x, t.right);
}
else {
return true;
}
}

contains方法主要是查找当前二叉树是否还有某个节点,利用了comparaTo方法递归调用。

findMin()与findMax()方法

 private BinaryNode<T> findMin(BinaryNode<T> t){
//非递归写法
if(t!=null)
while(t.left!=null)
t=t.left;
return t;
//递归写法
/*if(t==null)
return null;
else if (t.left==null) {
return t;
}
return findMin(t.left);*/
}

findMin与findMax方法类似,这里只列出一种即可。然后仍有两种方法解决此问题,一种为递归,一种非递归。

非递归方法就是采用了while循坏思想,直到找出最左的节点即可。

insert方法

 private BinaryNode<T> insert(T x,BinaryNode<T> t){
if(t==null)//生成新的节点
return new BinaryNode<T>(x, null, null);
if(contains(x))//如果二叉树中已经有x元素,则不进行任何操作
return t;
else {
int compareResult=x.compareTo(root.element);
if(compareResult<0){
t.left=insert(x, t.left);
}
else {
t.right=insert(x, t.right);
}
return t;
}
}

remove方法

 private BinaryNode<T> remove(T x,BinaryNode<T> t){
if(t==null)
return t;
int compareResult=x.compareTo(t.element);
if(compareResult<0){
t.left=remove(x, t.left);
}
else if(compareResult>0){
t.right=remove(x, t.right);
}
else if (t.left!=null&&t.right!=null) { //两个孩子情况,采取懒惰删除
t.element=findMin(t.right).element;
t.right=remove(t.element, t.right);
}
else { //单个孩子情况
t=(t.left!=null)?t.left:t.right;
}
return t;
}

删除节点时需要考虑两种情况,一种为两个孩子的情况,一种为单个孩子的情况。

如图为删除5节点为单个孩子情况

此图是删除3节点两个孩子的情况,具体做法是找出该节点右子树中最小的节点替换当前删除的节点

全部的代码如下(暂缺遍历)

 package Tree;

 public class BinarySearchTree<T extends Comparable<? super T>> {
private static class BinaryNode<T>{
BinaryNode(T theElement) {
this(theElement,null,null);
}
BinaryNode(T theElement,BinaryNode<T> lt,BinaryNode<T> rt) {
element=theElement;
left=lt;
right=rt;
}
T element;//根节点
BinaryNode<T> left;//左子树
BinaryNode<T> right;//右子树
}
private BinaryNode<T> root;//定义根节点
public BinarySearchTree() {
root=null;
}
public void makeEmpty(){
root=null;
}
public boolean isEmpty(){
return root==null;
}
public boolean contains(T x){
return contains(x,root);
}
public T findMin() throws Exception{
if(isEmpty())
throw new Exception();
return findMin(root).element;
}
public T findMax() throws Exception{
if(isEmpty())
throw new Exception();
return findMax(root).element;
}
public void insert(T x){
root=insert(x,root);
}
public void remove(T x){
root=remove(x,root);
}
private boolean contains(T x,BinaryNode<T> t){
if(t==null)
return false;
int compareResult=x.compareTo(t.element);
if(compareResult<0)
return contains(x,t.left); //递归
else if (compareResult>0) {
return contains(x, t.right);
}
else {
return true;
}
}
private BinaryNode<T> findMin(BinaryNode<T> t){
//非递归写法
if(t!=null)
while(t.left!=null)
t=t.left;
return t;
//递归写法
/*if(t==null)
return null;
else if (t.left==null) {
return t;
}
return findMin(t.left);*/
}
private BinaryNode<T> findMax(BinaryNode<T> t){
if(t!=null)
while(t.right!=null)
t=t.right;
return t;
}
private BinaryNode<T> insert(T x,BinaryNode<T> t){
if(t==null)//生成新的节点
return new BinaryNode<T>(x, null, null);
if(contains(x))//如果二叉树中已经有x元素,则不进行任何操作
return t;
else {
int compareResult=x.compareTo(root.element);
if(compareResult<0){
t.left=insert(x, t.left);
}
else {
t.right=insert(x, t.right);
}
return t;
}
}
private BinaryNode<T> remove(T x,BinaryNode<T> t){
if(t==null)
return t;
int compareResult=x.compareTo(t.element);
if(compareResult<0){
t.left=remove(x, t.left);
}
else if(compareResult>0){
t.right=remove(x, t.right);
}
else if (t.left!=null&&t.right!=null) { //两个孩子情况,采取懒惰删除
t.element=findMin(t.right).element;
t.right=remove(t.element, t.right);
}
else { //单个孩子情况
t=(t.left!=null)?t.left:t.right;
}
return t;
} }

也可访问我的gihub数据结构的部分,暂时内容较少。

JAVA数据结构--二叉查找树的更多相关文章

  1. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

  2. Java数据结构和算法(二)树的基本操作

    Java数据结构和算法(二)树的基本操作 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 一.树的遍历 二叉树遍历分为:前序遍 ...

  3. 数据结构:JAVA实现二叉查找树

    数据结构:JAVA实现二叉查找树 写在前面 二叉查找树(搜索树)是一种能将链表插入的灵活性与有序数组查找的高效性结合在一起的一种数据结构. 观察二叉查找树,我们发现任何一个节点大于左子节点且小于其右子 ...

  4. 数据结构------------------二叉查找树(BST)的java实现

    数据结构------------------二叉查找树(BST)的java实现 二叉查找树(BST)是一种能够将链表插入的灵活性和有序数组查找的高效性相结合的一种数据结构.它的定义如下: 二叉查找树是 ...

  5. Java数据结构和算法(七)B+ 树

    Java数据结构和算法(七)B+ 树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 我们都知道二叉查找树的查找的时间复杂度是 ...

  6. Java数据结构和算法(五)二叉排序树(BST)

    Java数据结构和算法(五)二叉排序树(BST) 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 二叉排序树(Binary S ...

  7. Java数据结构和算法(二)顺序存储的树结构

    Java数据结构和算法(二)顺序存储的树结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 二叉树也可以用数组存储,可以和完 ...

  8. 一文掌握关于Java数据结构所有知识点(欢迎一起完善)

    在我们学习Java的时候,很多人会面临我不知道继续学什么或者面试会问什么的尴尬情况(我本人之前就很迷茫).所以,我决定通过这个开源平台来帮助一些有需要的人,通过下面的内容,你会掌握系统的Java学习以 ...

  9. java数据结构和算法06(红黑树)

    这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的 ...

随机推荐

  1. 添加字段modify

    ALTER TABLE tc_activity_turntable ADD `foot_pic` VARCHAR () NOT NULL DEFAULT '' COMMENT '底部图片';

  2. rocketmq安装部署过程(4.0.0版本)

    准备工作 3个虚拟机节点的构成如下 : 安装步骤 操作过程 1.安装包已经上传至其中1个节点. 2.解压缩安装包 命令:unzip rocketmq-all-4.0.0-incubating-bin- ...

  3. NAT穿透的详细讲解及分析.RP

    原创出处:https://bbs.pediy.com/thread-131961.htm 转载来源: https://blog.csdn.net/g_brightboy/article/details ...

  4. Photo4

    Story: 我手捧玫瑰,一个人,走在桥上.桥下是波澜壮阔的大海,一不小心,我就有失足的危险.海鸟的低鸣在我耳际盘旋着,浪汹涌,仿佛要把我吞噬掉.你也许奇怪,为何我一人手捧玫瑰走在桥上.只因,女骑从来 ...

  5. c#范型

    泛型介绍:范型类和范型方法同事具备可重用性.类型安全和效率,这是非范型类和非范型方法无法具备的. 所谓范型,即通过参数化类型实现同一份代码上操作多种数据类型,范型编程是一种编程范式,它利用“参数化类型 ...

  6. [Selenium With C#基础教程] Lesson-05 文本框

    作者:Surpassme 来源:http://www.jianshu.com/p/7dca7d0d1ea3 声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢. 文本框在Web页面中 ...

  7. WCF 学习笔记

    Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终结点发送至另一个服务终结点.服务终结点 ...

  8. phpize命令在安装AMQP插件是报错phpize:Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF envir的解决方法

    phpize命令在安装AMQP插件是报错phpize:Cannot find autoconf. Please check your autoconf installation and the $PH ...

  9. opencv——(动态)旋转图像

    #include "stdafx.h" #include <opencv2\opencv.hpp> #include <opencv\cv.h> #incl ...

  10. EF中三大开发模式之DB First,Model First,Code First以及在Production Environment中的抉择

    一:ef中的三种开发方式 1. db first... db放在第一位,在我们开发之前必须要有完整的database,实际开发中用到最多的... <1> DBset集合的单复数... db ...