一.二分搜索树:

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. 排序算法之冒泡排序的思想以及Java实现

    1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称 ...

  2. python3编写网络爬虫23-分布式爬虫

    一.分布式爬虫 前面我们了解Scrapy爬虫框架的基本用法 这些框架都是在同一台主机运行的 爬取效率有限 如果多台主机协同爬取 爬取效率必然成倍增长这就是分布式爬虫的优势 1. 分布式爬虫基本原理 1 ...

  3. 《Java大学教程》--第3章 迭代

    迭代(iteration).重复(repetition):三种循环* for: 重复执行固定次数* while: 重复执行不固定次数* do...while: 比while至少多一次 1.答:P47迭 ...

  4. @RequestParam 和@RequestBody 的区别?

    @RequestParam用来接收: 1 用来处理简单的参数绑定 2 用来接收 Content-Type 是   application/x-www-form-urlencoded (这种格 式的数据 ...

  5. 1.03-get_params2

    import urllib.request import urllib.parse import string def get_params(): url = "http://www.bai ...

  6. 单片机与android手机通信(控制LED小灯亮灭)

    1.单片机实验板功能设计 为验证数据通信内容,让单片机板上的四个按键与android手机客户端上的四个LED灯相互控制:为达到上述基本实验要求,采用单字符传输数据即可,硬件需设计两块相同的单片机电路板 ...

  7. SecureCRT 使用 rz命令提示waiting to receive.**B0100000023be50

    SecureCRT 远程连接Linux服务器,使用 rz命令提示waiting to receive.**B0100000023be50,或者使用sz命令提示: **B0100000023be50 解 ...

  8. 【转】js中通过docment.cookie获取到的内容不完整! 在浏览器的application里的cookie里可以看到完整的cookie,个别字段无法通过document.cookie获取。 是否有其他办法可以获取到??

    js中通过docment.cookie获取到的内容不完整!在浏览器的application里的cookie里可以看到完整的cookie,个别字段无法通过document.cookie获取.是否有其他办 ...

  9. Python:Day03 变量、字符编码

    配置环境变量 右键计算机--->属性--->高级系统设置--->高级--->环境变量--->系统变量--->找到Path,双击编辑--->将程序的路径粘贴上去 ...

  10. centos7 搭建openvpn服务器

    OpenVPN是一个开源代码的VPN应用程序,可让您在公共互联网上安全地创建和加入专用网络.相比pptp,openvpn更稳定.安全. 本篇博客主要介绍下面两点: 1. Centos 7下安装与配置O ...