上代码:

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

  1. 数据结构------------------二叉查找树(BST)的java实现

    数据结构------------------二叉查找树(BST)的java实现 二叉查找树(BST)是一种能够将链表插入的灵活性和有序数组查找的高效性相结合的一种数据结构.它的定义如下: 二叉查找树是 ...

  2. 数据结构与抽象 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. ...

  3. 二叉查找树的Java实现

    为了克服对树结构编程的恐惧感,决心自己实现一遍二叉查找树,以便掌握关于树结构编程的一些技巧和方法.以下是基本思路: [1] 关于容器与封装.封装,是一种非常重要的系统设计思想:无论是面向过程的函数,还 ...

  4. 二叉查找树之 Java的实现

    参考:http://www.cnblogs.com/skywang12345/p/3576452.html 二叉查找树简介 二叉查找树(Binary Search Tree),又被称为二叉搜索树.它是 ...

  5. 数据结构与算法Java描述 队列

    package com.cjm.queue; /** * 数据结构与算法Java实现 队列 * * @author 小明 * */ public class Myqueue { private Nod ...

  6. 数据结构——单链表java简易实现

    巩固数据结构 单链表java实现 单链表除了表尾 每个几点都有一个后继 结点有数据和后继指针组成  通过构建表头和表尾(尾部追加需要)两个特殊几点 实现单链表的一些操作,代码如下 package co ...

  7. 《数据结构与算法分析-Java语言描述》 分享下载

    书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...

  8. 数据结构--队列(Java实现)

    数据结构--队列(Java实现) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 简介 队列是一种特殊的线性表,特殊之处在于它只 ...

  9. 数据结构与算法 java描述 第一章 算法及其复杂度

    目录 数据结构与算法 java描述 笔记 第一章 算法及其复杂度 算法的定义 算法性能的分析与评价 问题规模.运行时间及时间复杂度 渐进复杂度 大 O 记号 大Ω记号 Θ记号 空间复杂度 算法复杂度及 ...

随机推荐

  1. javaweb部署多个项目(复制的项目)

    最近需要在一台服务器部署两个已经编译完了的javaweb项目,但是因为项目名一样,仅修改文件夹的名字无法实现两个项目共存,最后只能考虑采用部署多个tomcat服务器的方法来实现.搜索后终于找到个好方法 ...

  2. 如何编写通用的 Helper Class

    Github: https://github.com/nzbin/snack-helper Docs: https://nzbin.github.io/snack-helper 前言 什么是 help ...

  3. spring AOP 和自定义注解进行身份验证

    一个SSH的项目(springmvc+hibernate),需要提供接口给app使用.首先考虑的就是权限问题,app要遵循极简模式,部分内容无需验证,用过滤器不能解决某些无需验证的方法 所以最终选择用 ...

  4. 为什么选择使用Sass而不是Less?

    这篇文章主要解答以下几个问题,供前端开发者的新手参考. 1.什么是Sass和Less? 2.为什么要使用CSS预处理器? 3.Sass和Less的比较 4.为什么选择使用Sass而不是Less? 什么 ...

  5. (二)SVN的安装

    1,首先下载SVN的服务端和客户端地址如下http://subversion.apache.org/packages.html.进入网址后滚动到浏览器最底部. (因为我的系统是Windows所以我选择 ...

  6. AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告(上篇)

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 张钦坤 腾讯研究院秘书长蔡雄山 腾讯研究院法律研究中心副主任祝林华 腾讯研究院法律研究中心助理研究员曹建峰 腾讯研究院法律研究中心高级研究员 ...

  7. linux 安装nginx 详解

    1 nginx安装环境 nginx是C语言开发,建议在linux上运行,本教程使用Centos6.5作为安装环境. n gcc 安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,如果没 ...

  8. 小程序基于疼讯qcloud的nodejs开发服务器部署

        腾讯,疼讯,很疼. 请慎重看腾讯给出的文档,最好做一个笔记. 我只能说我能力有限,在腾讯云小程序的文档中跳了n天. 最后还是觉得记录下来,以防止我的cpu过载给烧了. 此文档是对<小程序 ...

  9. AIO5系统中关于赠品处理的方法

    最近频繁有人问我,关于赠品在AIO5系统中如何处理.首先AIO5系统支持赠品处理关于赠品,在AIO5系统中走的是[其他出库单]路径:仓库--仓库作业--其他出库单--新增(如下图) 通常赠品对应的业务 ...

  10. lua元表

    __index元方法:按照之前的说法,如果A的元表是B,那么如果访问了一个A中不存在的成员,就会访问查找B中有没有这个成员.这个过程大体是这样,但却不完全是这样,实际上,即使将A的元表设置为B,而且B ...