自己实现数据结构系列五---BinarySearchTree
一.二分搜索树:
1.代码:
public class BST<E extends Comparable<E>> {
private class Node{
public E e;
public Node left;
public Node right;
public Node(E e){
this.e = e;
left = null;
right = null;
}
}
private Node root;
private int size;
public BST(){
root = null;
size = 0;
}
public int getSize(){
return size;
}
public boolean isEmpty(){
return size ==0;
}
//向以node为根的二分搜索树中插入元素e,递归算法
private void add(Node node,E e){
if (e.equals(node.e)){
return;
}else if(e.compareTo(node.e) < 0 && node.left == null){
node.left = new Node(e);
size++;
return;
}else if(e.compareTo(node.e) > 0 && node.right == null){
node.right = new Node(e);
size++;
return;
}
if (e.compareTo(node.e) < 0 )
add(node.left,e);
else
add(node.right,e);
}
/**
* 向二分搜索树中添加新元素e
* @param e
*/
public void add(E e){
if(root == null){
root = new Node(e);
size++;
}else {
add(root,e);
}
}
// /**
// * //向以node为根的二分搜索树中插入元素e,递归算法。上面add(Node node,E e)方法的优化
// * @param node
// * @param e
// * @return
// */
// private Node addPlus(Node node ,E e){
// if (node == null){
// size++;
// return new Node(e);
// }
// if (e.compareTo(node.e) < 0){
// node.left = addPlus(node.left,e);
// }else if(e.compareTo(node.e) > 0){
// node.right = addPlus(node.right,e);
// }
// return node;
// }
//
// public void addPlus(E e){
// root = addPlus(root,e);
// }
public boolean contains(E e){
return contains(root,e);
}
/**
* 以node为根的二分搜索树中是否包含元素e,递归算法
* @param node
* @param e
* @return
*/
private boolean contains(Node node,E e){
if(node == null){
return false;
}
if (e.compareTo(node.e) == 0){
return true;
}else if(e.compareTo(node.e) < 0){
return contains(node.left,e);
}else {
return contains(node.right,e);
}
}
/**
* 前序遍历以node为根的二分搜索树,递归算法
* @param node
*/
private void preOrder(Node node){
if (node == null)
return;
System.out.println(node.e);
preOrder(node.left);
preOrder(node.right);
}
/**
* 二分搜索树前序遍历 : 又叫:深度优先搜索
*/
public void preOrder(){
preOrder(root);
}
/**
* 二分搜索树层序遍历 : 广度优先遍历
*/
public void levelOrder(){
java.util.Queue<Node> q = new java.util.LinkedList<>();
q.add(root);
while (!q.isEmpty()){
Node cur = q.remove();
System.out.println(cur.e);
if (cur.left!=null){
q.add(cur.left);
}
if (cur.right != null){
q.add(cur.right);
}
}
}
/**
* 寻找二分搜索树的最小元素
* @return
*/
public E minimum(){
if (size == 0)
throw new IllegalArgumentException();
return minimum(root).e;
}
/**
* 一直向左搜索
* @param node
* @return
*/
private Node minimum(Node node){
if (node.left == null)
return node;
return minimum(node.left);//向左搜索
}
/**
* 删除二分搜索树中最小值
* @return
*/
public E removeMin(){
//找到最小值
E ret = minimum();
root = removeMin(root);
return ret;
}
/**
* 一直向左遍历
* @param node
* @return
*/
private Node removeMin(Node node){
if (node.left == null){
Node rightNode = node.right;
node.right = null;
size--;
return rightNode;
}
node.left = removeMin(node.left);
return node;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
generateBSTString(root,0,res);
return res.toString();
}
private void generateBSTString(Node node, int deepth, StringBuilder res) {
if (node == null){
res.append(generateDepthString(deepth)+"null\n");
return;
}
res.append(generateDepthString(deepth)+node.e+"\n");
generateBSTString(node.left,deepth+1,res);
generateBSTString(node.right,deepth+1,res);
}
private String generateDepthString(int deepth) {
StringBuilder res = new StringBuilder();
for (int i = 0; i < deepth;i++){
res.append("--");
}
return res.toString();
}
}
自己实现数据结构系列五---BinarySearchTree的更多相关文章
- C语言高速入门系列(五)
C语言高速入门系列(五) C语言指针初涉 ------转载请注明出处:coder-pig 本节引言: 上一节我们对C ...
- CSS 魔法系列:纯 CSS 绘制各种图形《系列五》
我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- Netty4.x中文教程系列(五)编解码器Codec
Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...
- WCF编程系列(五)元数据
WCF编程系列(五)元数据 示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...
- JVM系列五:JVM监测&工具
JVM系列五:JVM监测&工具[整理中] http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...
- SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...
- VSTO之旅系列(五):创建Outlook解决方案
原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...
- 系列五AnkhSvn
原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...
随机推荐
- Linux安装Python3后,如何使用pip命令
系统环境:CentOS7.4 已安装好Python3.6.5 Python3.6.5自带pip 使用pip安装第三方库,可运行指令,例如安装paramiko库: python -m pip insta ...
- 实现Github和Coding仓库等Git服务托管更新
如何使Github.Coding.Gitee 码云 同时发布更新,多个不同Git服务器之间同时管理部署发布提交 缘由 因为在Github上托管的静态页面访问加载速度较为缓慢,故想在Coding上再建一 ...
- 使用蒲公英路由器 X3 设置为网络中继器
由于我的路由器放的时间比较久没有用了,所以先让路由器来个升级.链接图如下: 在浏览器地址栏中输入 oraybox.com,系统会自动跳到 https://pgybox.oray.com/passpo ...
- 文件下载中使用inputStream流获取文件大小
inputStream.available()获取的是文件的字节大小 InputStream inputStream = new FileInputStream(new File(path)); re ...
- zabbix全网监控
为什么要监控 运维的职责1.保障企业数据的安全可靠.2.为客户提供7*24小时服务.3.不断提升用户的体验. 在关键时刻,提前提醒我们服务器要出问题了 当出问题之后,可以便于找到问题的根源 拿到公司服 ...
- Tesseract-OCR识别
参考 https://studygolang.com/topics/4527/comment/13217 安装版Windows下链接: https://digi.bib.uni-mannheim.de ...
- 【转】Xposed出现 java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
Xposed出现 java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implem ...
- 如何让Node.js运行在浏览器端
Node.js又称服务端JavaScript.今天我为了解决一个问题,通过搜索引擎找到了如何将Node.js转成浏览器端可以运行的javascript.尽管这种方式有其局限性,但是还是可以用的. 1. ...
- 强大的原生DOM选择器querySelector和querySelectorAll
在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...
- 环境部署(七):linux下Jenkins+Git+JDK持续集成
前面几篇博客介绍了linux下安装Jenkins.Git.JDK以及Git基础教程和Git关联github等内容,这篇博客,介绍下如何在linux服务器中利用它们构建持续集成环境... 一.准备工作 ...