上一篇总结了索引查找,这一篇要总结的是二叉排序树(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

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

  1. 算法8 五大查找之:二叉排序树(BSTree)

    上一篇总结了索引查找,这一篇要总结的是二叉排序树,又称为二叉搜索树(BSTree) . 构造一棵二叉排序树的目的,其实并不是为了排序,而是为了提高查找和插入删除的效率. 什么是二叉排序树呢?二叉排序树 ...

  2. C++11写算法之二分查找

    同样的,二分查找很好理解,不多做解释,要注意二分查找的list必须是排好序的. 这里实现了两种二分查找的算法,一种递归一种非递归,看看代码应该差不多是秒懂.想试验两种算法,改变一下findFunc函数 ...

  3. Atitit.软件中见算法 程序设计五大种类算法

    Atitit.软件中见算法 程序设计五大种类算法 1. 算法的定义1 2. 算法的复杂度1 2.1. Algo cate2 3. 分治法2 4. 动态规划法2 5. 贪心算法3 6. 回溯法3 7. ...

  4. Java中的查找算法之顺序查找(Sequential Search)

    Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...

  5. 1101: 零起点学算法08——简单的输入和计算(a+b)

    1101: 零起点学算法08--简单的输入和计算(a+b) Time Limit: 1 Sec  Memory Limit: 128 MB   64bit IO Format: %lldSubmitt ...

  6. 【算法】二分查找法&大O表示法

    二分查找 基本概念 二分查找是一种算法,其输入是一个有序的元素列表.如果要查找的元素包含在列表中,二分查找返回其位置:否则返回null. 使用二分查找时,每次都排除一半的数字 对于包含n个元素的列表, ...

  7. javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)

    javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...

  8. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){ if ( ...

  9. javascript数据结构与算法---检索算法(顺序查找、最大最小值、自组织查询)

    javascript数据结构与算法---检索算法(顺序查找.最大最小值.自组织查询) 一.顺序查找法 /* * 顺序查找法 * * 顺序查找法只要从列表的第一个元素开始循环,然后逐个与要查找的数据进行 ...

随机推荐

  1. CF 1037 D. Valid BFS?

    D. Valid BFS? http://codeforces.com/contest/1037/problem/D 题意: 给一个序列,一棵树,判断能否bfs这棵树,得到这个序列. 分析: 将每个点 ...

  2. 3060 抓住那头奶牛 USACO

    3060 抓住那头奶牛 USACO 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 农夫约翰被告知一头逃跑奶牛的位置,想要立即抓住它, ...

  3. symfony注册Twig模板中使用自定义PHP方法

    // 注:只是在此做下记录,有兴趣的可以参考,不做实际教程文档// 官方文档,https://symfony.com/doc/2.8/templating/twig_extension.html// ...

  4. Java普通编程和Web网络编程准备工作

    一.工具下载 链接:https://pan.baidu.com/s/1geOdq3h 密码:pzl5 二.Java普通编程 解压下载的资料,并按readme.txt安装jdk和Eclipse. 三.J ...

  5. Spring学习(3):IOC基础(转载)

    一. IoC是什么 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...

  6. Atom 插件 Sync Settings 备份与恢复

    当使用 Atom IDEA.随着使用的越来越多,安装的插件也越来越多,一旦电脑重装后需要复原开发环境,这将是一件比较头疼的事.「Sync Settings」插件可以帮助我们解决这个问题. 操作流程 安 ...

  7. cinder的组件

    跟nova相似,cinder也有很多组件,每个组件负责各自的业务,然后共同协作完成volume的管理.组件之间的通信方式与nova个组件之间的通信方式相同,都是通过消息队列进行通信. cinder-a ...

  8. spring-boot-mybatis搭建

    写在开始 mybatis是一个持久化框架,支持手动sql.存储过程.高级映射.mybatis支持XML方式或注解方式将POJO与数据库表间建立映射. maven依赖 spring-boot.mysql ...

  9. 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

    作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09     据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...

  10. 深度系统(deepin)与win10双系统切换设置

    之前在win10下安装了深度系统,我不知道其他人在双系统切换的时候是否需要更改BIOS参数,我根据我的实际情况给出双系统切换设置的解决方案. 1.开机后进入选项System setup 2.按照下图选 ...