二叉排序树(Binary Sort Tree),又称为二叉查找树(Binary Search Tree) ,即BSTree。

构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除的效率。

什么是二叉排序树呢?二叉排序树具有以下几个特点。

(1)若根节点有左子树,则左子树的所有节点都比根节点小。

(2)若根节点有右子树,则右子树的所有节点都比根节点大。

(3)根节点的左,右子树也分别是二叉排序树。

1、二叉排序树的图示

下面是二叉排序树的图示,通过它可以加深对二叉排序树的理解。

2、二叉排序树常见的操作及思路

下面是二叉排序树常见的操作及思路。

2-1、插入节点

思路:比如我们要插入数字20到这棵二叉排序树中。那么步骤如下:

(1)首先将20与根节点进行比较,发现比根节点小,所以继续与根节点的左子树30比较。

(2)发现20比30也要小,所以继续与30的左子树10进行比较。

(3)发现20比10要大,所以就将20插入到10的右子树中。

此时的二叉排序树如下图:

2-2、查找节点

比如我们要查找节点10,那么思路如下:

(1)还是一样,首先将10与根节点50进行比较,发现比根节点要小,所以继续与根节点的左子树30进行比较。

(2)发现10比左子树30要小,所以继续与30的左子树10进行比较。

(3)发现两值相等,即查找成功,返回10的位置。

2-3、删除节点

删除节点的情况相对复杂,主要分为以下三种情形:

(1)删除的是叶节点(即没有孩子节点的)。比如20,删除它不会破坏原来树的结构,最简单。如图所示。

(2)删除的是单孩子节点。比如90,删除它后需要将它的孩子节点与自己的父节点相连。情形比第一种复杂一些。

(3)删除的是有左右孩子的节点。比如根节点50

这里有一个问题就是删除它后,谁将作为根节点?利用二叉树的中序遍历,就是右节点的左子树的最左孩子。

3、代码

有了思路之后,下面就开始写代码来实现这些功能。

BSTreeNode.java

public class BSTreeNode {
public int data;
public BSTreeNode left;
public BSTreeNode right; public BSTreeNode(int data) {
this.data = data;
}
}

BSTreeOperate.java

/**
* 二叉排序树的常见操作
*/
public class BSTreeOperate { // 树的根节点
public BSTreeNode root;
// 记录树的节点个数
public int size; /**
* 创建二叉排序树
*
* @param list
* @return
*/
public BSTreeNode create(int[] list) { for (int i = 0; i < list.length; i++) {
insert(list[i]);
}
return root;
} /**
* 插入一个值为data的节点
*
* @param data
*/
public void insert(int data) {
insert(new BSTreeNode(data));
} /**
* 插入一个节点
*
* @param bsTreeNode
*/
public void insert(BSTreeNode bsTreeNode) {
if (root == null) {
root = bsTreeNode;
size++;
return;
}
BSTreeNode current = root;
while (true) {
if (bsTreeNode.data <= current.data) {
// 如果插入节点的值小于当前节点的值,说明应该插入到当前节点左子树,而此时如果左子树为空,就直接设置当前节点的左子树为插入节点。
if (current.left == null) {
current.left = bsTreeNode;
size++;
return;
}
current = current.left;
} else {
// 如果插入节点的值大于当前节点的值,说明应该插入到当前节点右子树,而此时如果右子树为空,就直接设置当前节点的右子树为插入节点。
if (current.right == null) {
current.right = bsTreeNode;
size++;
return;
}
current = current.right;
}
}
} /**
* 中序遍历
*
* @param bsTreeNode
*/
public void LDR(BSTreeNode bsTreeNode) {
if (bsTreeNode != null) {
// 遍历左子树
LDR(bsTreeNode.left);
// 输出节点数据
System.out.print(bsTreeNode.data + " ");
// 遍历右子树
LDR(bsTreeNode.right);
}
} /**
* 查找节点
*/
public boolean search(BSTreeNode bsTreeNode, int key) {
// 遍历完没有找到,查找失败
if (bsTreeNode == null) {
return false;
}
// 要查找的元素为当前节点,查找成功
if (key == bsTreeNode.data) {
return true;
}
// 继续去当前节点的左子树中查找,否则去当前节点的右子树中查找
if (key < bsTreeNode.data) {
return search(bsTreeNode.left, key);
} else {
return search(bsTreeNode.right, key);
}
}
}

BSTreeOperateTest.java

public class BSTreeOperateTest {
public static void main(String[] args) {
BSTreeOperate bsTreeOperate = new BSTreeOperate();
int[] list = new int[]{50, 30, 70, 10, 40, 90, 80};
System.out.println("*********创建二叉排序树*********");
BSTreeNode bsTreeNode = bsTreeOperate.create(list);
System.out.println("中序遍历原始的数据:");
bsTreeOperate.LDR(bsTreeNode);
System.out.println("");
System.out.println(""); System.out.println("********查找节点*******");
System.out.println("元素20是否在树中:" + bsTreeOperate.search(bsTreeNode, 20));
System.out.println(""); System.out.println("********插入节点*******");
System.out.println("将元素20插入到树中");
bsTreeOperate.insert(20);
System.out.println("中序遍历:");
bsTreeOperate.LDR(bsTreeNode);
System.out.println("");
System.out.println(""); System.out.println("********查找节点*******");
System.out.println("元素20是否在树中:" + bsTreeOperate.search(bsTreeNode, 20));
System.out.println("");
}
}

运行结果:

欢迎转载,但请保留文章原始出处

本文地址:http://www.cnblogs.com/nnngu/p/8294714.html

(转)查找算法:二叉排序树(BSTree)的更多相关文章

  1. 【Java】 大话数据结构(11) 查找算法(2)(二叉排序树/二叉搜索树)

    本文根据<大话数据结构>一书,实现了Java版的二叉排序树/二叉搜索树. 二叉排序树介绍 在上篇博客中,顺序表的插入和删除效率还可以,但查找效率很低:而有序线性表中,可以使用折半.插值.斐 ...

  2. [Data Structure & Algorithm] 七大查找算法

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找 ...

  3. 七大查找算法(附C语言代码实现)

    来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...

  4. 查找->动态查找表->二叉排序树

    文字描述 二叉排序树的定义 又称二叉查找树,英文名为Binary Sort Tree, 简称BST.它是这样一棵树:或者是一棵空树:或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结 ...

  5. 查找算法总结Java实现

    之前对查找算法做的一些简单总结与实现: 查找算法时间复杂度: 1.二分查找的实现(待补充) public class Test { //循环实现二分查找 public static int binar ...

  6. 查找算法(5)--Tree table lookup--树表查找

    1.树表查找 (1) 最简单的树表查找算法——二叉树查找算法. [1]基本思想:二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适 ...

  7. JS-七大查找算法

    顺序查找 二分查找 插值查找 斐波那契查找 树表查找 分块查找 哈希查找 查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录).查找算法分类:1)静态查找和动态查找:注 ...

  8. 数据结构和算法(Golang实现)(27)查找算法-二叉查找树

    二叉查找树 二叉查找树,又叫二叉排序树,二叉搜索树,是一种有特定规则的二叉树,定义如下: 它是一颗二叉树,或者是空树. 左子树所有节点的值都小于它的根节点,右子树所有节点的值都大于它的根节点. 左右子 ...

  9. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  10. PHP的排序算法跟查找算法

    排序算法: (1)冒泡排序 $arr = array(15,8,20,50,37,85,10,5,11,4); //冒泡排序 function maoPao($arr){ for($i = 0; $i ...

随机推荐

  1. @EnableTransactionManagement的使用

    Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactio ...

  2. Reids入门介绍

    一.入门概述 1.是什么? Redis:REmote DIctionary Server(远程字典服务器) 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式 ...

  3. DQL:查询表中数据

    1. 基础查询 (1) 查询整表 SELECT * FROM 表名; -- 不推荐使用"*",不方便阅读 (2) 选择性查询 SELECT 列名,列名,列名 FROM 表名; (3 ...

  4. sql注入笔记-mysql

    整理下sql相关知识,查漏补缺(长期更新) 1 常用语句及知识 information_schema包含了大量有用的信息,例如下图 mysql.user下有所有的用户信息,其中authenticati ...

  5. arcgis的arcpy写入几何怎么创建一个空心面要素并读取几何和属性信息,根本不够管

    转载请注明作者(独孤尚良dugushangliang)出处:https://blog.csdn.net/dugushangliang/article/details/83861447 这个我是没找到这 ...

  6. MySQL中的sys系统数据库是干嘛的

    mysql5.7增加了sys 系统数据库,通过这个库可以快速的了解系统的元数据信息 这个库确实可以方便DBA发现数据库的很多信息,解决性能瓶颈都提供了巨大帮助   这个库在mysql5.7中是默认存在 ...

  7. 004-log-common-logging,Apache整合日志框架JCL门面框架、JCL+log4j

    一.概述 Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具.它提供给中间件/日志工具开发者一个 ...

  8. [Scikit-learn] *2.3 Clustering - MeanShift

    sklearn.cluster.MeanShift Ref: http://scikit-learn.org/stable/auto_examples/cluster/plot_mean_shift. ...

  9. JAVA 基础编程练习题21 【程序 21 求阶乘】

    21 [程序 21 求阶乘] 题目:求 1+2!+3!+...+20!的和 程序分析:此程序只是把累加变成了累乘. package cskaoyan; public class cskaoyan21 ...

  10. web框架学习路线

    0.配置 1.路由 2.view 3.model 4.序列化与反序列化. 5.auth&permission 6.header处理 7.http client