数据结构--二叉查找树的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 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...
随机推荐
- 按键精灵 vbs 获取网页源码 xp系统被拒绝
如下面的代码所示,获取新浪博客某个指定网页的源码 verurl = "http://blog.sina.com.cn/s/blog_9ea1db7b0101o7ch.html?" ...
- NoSQL:redis缓存数据库
一 Redis介绍 Redis和Memcached类似,也属于key-value nosql 数据库 Redis官网redis.io, 当前最新稳定版4.0.1 和Memcached类似,它支持存储的 ...
- 线上Mysql数据库崩溃事故的原因和处理
前文提要 承接前文<一次线上Mysql数据库崩溃事故的记录>,在文章中讲到了一次线上数据库崩溃的事件记录,建议两篇文章结合在一起看,不至于摸不着头脑. 由于时间原因,其中只讲了当时的一些经 ...
- map的常用方法
1.头文件: #include<map> 2.定义: map<string,int>Map; 或: typedef map<string,int> MAP; MAP ...
- FPGA跨时钟域处理方法
文章主要是基于学习后的总结. 1. 时钟域 假如设计中所有的触发器都使用一个全局网络,比如FPGA的主时钟输入,那么我们说这个设计只有一个时钟域.假如设计有两个输入时钟,如图1所示,一个时钟给接口1使 ...
- java历史概述
java简介Java是由Sun Microsystems公司于 1995年5月推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称.由James Gosling和同事们共同研 ...
- UWP更改标题栏颜色
你是否因为UWP标题栏太丑而想过改变?那么这篇文章或许可以帮助你美化UWP界面,让你的UWP的标题栏也变好看 这里的代码,都要在MainPage的构造函数中.如果你在App类中更改了首页,则在该首页的 ...
- 使用Microsoft.AspNetCore.TestHost进行完整的功能测试
简介 Microsoft.AspNetCore.TestHost是可以用于Asp.net Core 的功能测试工具.很多时候我们一个接口写好了,单元测试什么的也都ok了,需要完整调试一下,检查下单元测 ...
- C# 跨平台的支付类库ICanPay
随着微软的开源,越来越多的项目支持跨平台,但是各种支付平台提供的类库,又老又不支持跨平台,吐槽下,尤其是微信,还有好多坑,于是ICanPay诞生了,今天就来讲ICanPay是什么,怎么使用? ICan ...
- Maven 整合 SSH 框架
前面的一系列文章中,我们总结了三大框架:Struts2,Hibernate,Spring 的基本知识.本篇就姑且尝试着使用 Maven 这个项目构建工具来将这三个框架整合一起.说到这里,如果有对 Ma ...