数据结构--二叉查找树的java实现
上代码:
package com.itany.erchachazhaoshu; public class BinarySearchTree<T extends Comparable<? super T>>
{
//定义二叉查找树的根节点 每个查找二叉树都有一个自己的root 节点 root外界看不到
private BinaryNode<T> root;
public BinarySearchTree()
{
root=null;
}
//节点类
private static class BinaryNode<T>
{
private T element;
private BinaryNode<T> left;
private BinaryNode<T> right;
public BinaryNode(T element)
{
this(element, null, null);
}
public BinaryNode(T element,BinaryNode<T> left,BinaryNode<T> right)
{
this.element=element;
this.left=left;
this.right=right;
}
}
public void makeEmpty()
{
root=null;
}
public boolean isEmpty()
{
return root==null;
}
public boolean contains(T t)
{
return contains(t,root);
}
//外界是不认识节点的 仅仅会返回T 布尔 或者根本无返回值
public T findMax() throws Exception
{
if(isEmpty())
throw new Exception();
return findMax(root).element;
}
public T findMin() throws Exception
{
if(isEmpty())
throw new Exception();
return findMin(root).element;
}
public void insert(T t)
{
root=insert(t,root);
}
public void remove(T t)
{
root=remove(t,root);
}
public void printTree()
{
if(isEmpty())
System.out.println("Empty Tree");
else
printTree(root);
}
//中序遍历
private void printTree(BinaryNode<T> root)
{
//假设递归到了叶子节点 没有左右的部分就不运行遍历 并且if也完毕了对非空的推断
if(null!=root)
{
printTree(root.left);
System.out.println(root.element);
printTree(root.right);
}
}
//此处使用的是尾递归
private boolean contains(T t,BinaryNode<T> root)
{
//必须在一開始就推断是否为null 否则在调用方法或元素时 会产生空指针异常 也是一个基准条件
if(root==null)
return false;
int compareRes=t.compareTo(root.element);
if(compareRes==0)
return true;
else if(compareRes<0)
return contains(t,root.left);//不会使栈频繁进出 仅仅会覆盖当前栈
else
return contains(t,root.right);
}
// 方法二 使用循环取代尾递归找出最大 是返回相应的那个节点
private BinaryNode<T> findMax(BinaryNode<T> root)
{
if(root==null)
return null;
else
{
while(root.right!=null)
{
root=root.right ;
}
}
return root;
}
//方法一 使用递归查找 返回最小节点的引用
private BinaryNode<T> findMin(BinaryNode<T> root)
{
//必须在一開始就推断是否为null 否则在调用方法或元素时 会产生空指针异常
if(root==null)
return null;
//基准条件
else if(root.left==null)
return root;
else
return findMin(root.left);
}
//返回一个插入了之后的整个节点 逐级返回
private BinaryNode<T> insert(T t,BinaryNode<T> root)
{
if(root==null)
return new BinaryNode<T>(t,null,null);
else
{
int com=t.compareTo(root.element);
if(com==0)
;
else if(com<0)
//不断更新当前root的left值 并返回root
root.left=insert(t,root.left);
else
root.right=insert(t,root.right);
return root;
}
}
//删除和添加一样 都要返回改动之后的节点
private BinaryNode<T> remove(T t,BinaryNode<T> root)
{
//没有找到删除的 什么也不做 直接返回该root
if(root==null)
return root;
int com=t.compareTo(root.element);
if(com<0)
{
root.left=remove(t,root.left);
}
else if(com>0)
{
root.right=remove(t,root.right);
}
else
{
//有两个儿子的情况
if(root.left!=null && root.right!=null)
{
root.element=findMin(root.right).element;
root.right=remove(root.element,root.right);//更新删除之后
}
else//包含一个儿子都没有的情况 有一个儿子的情况
return (root.left!=null)? root.left:root.right; }
return root;
}
}
package com.itany.erchachazhaoshu; public class Test
{ public static void main(String[] args)
{
BinarySearchTree bt=new BinarySearchTree();
bt.insert(3);
bt.insert(13);
bt.insert(1);
try
{
System.out.println("max:"+bt.findMax());
System.out.println("max:"+bt.findMin());
System.out.println(bt.contains(3));
bt.remove(13);
System.out.println(bt.contains(13));
}
catch (Exception e)
{
e.printStackTrace();
}
} }
数据结构--二叉查找树的java实现的更多相关文章
- 数据结构------------------二叉查找树(BST)的java实现
数据结构------------------二叉查找树(BST)的java实现 二叉查找树(BST)是一种能够将链表插入的灵活性和有序数组查找的高效性相结合的一种数据结构.它的定义如下: 二叉查找树是 ...
- 数据结构与抽象 Java语言描述 第4版 pdf (内含标签)
数据结构与抽象 Java语言描述 第4版 目录 前言引言组织数据序言设计类P.1封装P.2说明方法P.2.1注释P.2.2前置条件和后置条件P.2.3断言P.3Java接口P.3.1写一个接口P.3. ...
- 二叉查找树的Java实现
为了克服对树结构编程的恐惧感,决心自己实现一遍二叉查找树,以便掌握关于树结构编程的一些技巧和方法.以下是基本思路: [1] 关于容器与封装.封装,是一种非常重要的系统设计思想:无论是面向过程的函数,还 ...
- 二叉查找树之 Java的实现
参考:http://www.cnblogs.com/skywang12345/p/3576452.html 二叉查找树简介 二叉查找树(Binary Search Tree),又被称为二叉搜索树.它是 ...
- 数据结构与算法Java描述 队列
package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...
- 数据结构——单链表java简易实现
巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成 通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...
- 《数据结构与算法分析-Java语言描述》 分享下载
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...
- 数据结构--队列(Java实现)
数据结构--队列(Java实现) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 队列是一种特殊的线性表,特殊之处在于它只 ...
- 数据结构与算法 java描述 第一章 算法及其复杂度
目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...
随机推荐
- JavaScript系列----一切皆是对象
1.判断对象类型 1.1.typeof 运算符 首先要认识到,typepof是一个运算符,其运算需要一个参数,返回值是参数的类型. typeof使用方法 typeof parameter //使用方法 ...
- Docker Register安装与基本认证
准备 基本事项 Docker环境 登录授权方式 镜像存放地址 HTTPS外网访问 启动Docker Registry 1. 基本事项 本篇涉及到的数据文件都放在/data目录下, 其中会有三个子目录 ...
- [转载] 一致性hash算法释义
转载自http://www.cnblogs.com/haippy/archive/2011/12/10/2282943.html 一致性Hash算法背景 一致性哈希算法在1997年由麻省理工学院的Ka ...
- EasyNVR-流媒体服务详解
1.什么是流媒体 所谓流媒体是指采用流式传输的方式在Internet播放的媒体格式. 流媒体又叫流式媒体,它是指商家用一个视频传送服务器把节目当成数据包发出,传送到网络上. 2.Eas ...
- oracle数据库创建表,序列及添加代码案例
create table cdpt( id number(6), name varchar2(30), constraint pk_id primary key(id) ); 更改数据库的“延迟段创建 ...
- 最大似然估计 (Maximum Likelihood Estimation), 交叉熵 (Cross Entropy) 与深度神经网络
最近在看深度学习的"花书" (也就是Ian Goodfellow那本了),第五章机器学习基础部分的解释很精华,对比PRML少了很多复杂的推理,比较适合闲暇的时候翻开看看.今天准备写 ...
- [最短路]P1078 文化之旅
题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同 ...
- ASP.NET Core 一步步搭建个人网站(持续更新中~~~)
摘要 ASP.NET Core2.0发布有一阵子了,这是.NET 开源跨平台的一个重大里程碑, 也意味着比1.0版本要更加成熟.目前.net core具有开源.跨平台.灵活部署.模块化架构等等特性,吸 ...
- redis 梳理笔记(一)
一 redis 数据格式 短连接 长连接pconnect tcp协议 交互数据格式 交互采用特殊的格式 \r\n 1."+"号开头表示单行字符串的回复 set aa aa ...
- Cannot load browser "PhantomJS": it is not registered! Perhaps you are missing some plugin? 测试安装遇到的BUG
安装了半天phantomjs就是安装不好,后面想了个死办法,http://phantomjs.org/download.html这个网址下先去下载好 phantomjs-2.1.1-windows.z ...