一.二分搜索树:

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的更多相关文章

  1. C语言高速入门系列(五)

    C语言高速入门系列(五) C语言指针初涉                                           ------转载请注明出处:coder-pig 本节引言: 上一节我们对C ...

  2. CSS 魔法系列:纯 CSS 绘制各种图形《系列五》

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  3. JAVA数据结构系列 栈

    java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...

  4. Netty4.x中文教程系列(五)编解码器Codec

    Netty4.x中文教程系列(五)编解码器Codec 上一篇文章详细解释了ChannelHandler的相关构架设计,版本和设计逻辑变更等等. 这篇文章主要在于讲述Handler里面的Codec,也就 ...

  5. WCF编程系列(五)元数据

    WCF编程系列(五)元数据   示例一中我们使用了scvutil命令自动生成了服务的客户端代理类: svcutil http://localhost:8000/?wsdl /o:FirstServic ...

  6. JVM系列五:JVM监测&工具

    JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介 ...

  7. SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

    原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...

  8. VSTO之旅系列(五):创建Outlook解决方案

    原文:VSTO之旅系列(五):创建Outlook解决方案 本专题概要 引言 Outlook对象模型 自定义Outlook窗体 小结 一.引言 在上一个专题中,为大家简单介绍了下如何创建Word解决方案 ...

  9. 系列五AnkhSvn

    原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...

随机推荐

  1. php学习----什么是常量

    PHP-什么是常量 1.什么是常量?常量可以理解为值不变的量(如圆周率):或者是常量值被定义后,在脚本的其他任何地方都不可以被改变.PHP中的常量分为自定义常量和系统常量(后续小节会详细介绍). 2. ...

  2. 挂载KVM Guest操作系统磁盘

    使用虚拟机时, 发现想要修改虚拟机中的文件非常麻烦, 需要启动虚拟机, 然后再登录进去修改. 对于已经关闭的虚拟机, 为了修改一个文件而启动, 非常耽误时间. 对于一个无法启动的虚拟机(比如启动文件损 ...

  3. Java虚拟机(Java Virtual Machine)

    JVM(Java Virtual Machine),Java虚机机,是JDK最底层的东西.只要能将源代码编译成字节码(.class)文件,就可以由JVM在不同平台上解释成机器指令来执行.所以,Java ...

  4. ABAP 7.40, SP08 中的 Open SQL 新特性

    1,使用 data_source~*指定列 在7.40, SP08中,可以在SELECT语句中使用data_source~*来指定选取不同的数据库表.视图的全部列来作为结果集.它也可以和单独指定的列c ...

  5. 我的BRF+自学教程(二):跟踪模式(trace mode)

    使用自开发程序来处理业务逻辑时,处理过程通常是个黑箱,业务顾问和业务用户不知道程序的具体运行方式,要依赖文档和频繁的沟通来确认实际情况. BRFplus可以通过配置的方式实现业务逻辑,使得业务人员把业 ...

  6. 只有 assignment、call、increment、decrement 和 new 对象表达式可用作语句

    错误信息:只有 assignment.call.increment.decrement 和 new 对象表达式可用作语句: 分析:发生这种情况一般是在赋值时把“=”写成了“==”,例如:textBox ...

  7. YOLO 从数据集制作到训练

    1.图片数据集收集 共 16种 集装箱船 container ship 散货船 bulker 油船 tanker 游轮 / 客轮 / 邮轮 passenger liner 渔船 fishing boa ...

  8. 004_后端js编写工具

    一.框架同事用的后端调试用的工具 google=>"webpack dev server" https://webpack.github.io/docs/webpack-de ...

  9. <网络编程>IO复用

    IO复用是一种机制,一个进程可以监听多个描述符,一旦某个描述符就绪(读就绪和写就绪),能够同志程序进行相应的读写操作. 目前支持I/O复用的系统调用有select,poll,pselect,epoll ...

  10. GOjs版本2.0去除水印

    在go.js找到:"7eba17a4ca3b1a8346" 找到这个关键字,将: 改成:a.br=function(){return true}即可.