上代码:

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. zip 安装mysql 和遇到的坑

    在官网下载了mysql 社区版的,官方网址:https://dev.mysql.com/downloads/mysql/ 解压后发现里面没有安装快捷方式,才知道是zip解压,dos窗口安装.这就比界面 ...

  2. c语言学习笔记 —— 数组

    1. 数组的内存分配原理. 数组定义  int a[3] = {1,3,11}; 如下写法是错误的: int number; int a[number] = {1,7,9}; 原因是:没有定长的数组初 ...

  3. 根据矩阵变化实现基于 HTML5 的 WebGL 3D 自动布局

    在数学中,矩阵是以行和列排列的数字,符号或表达式的矩形阵列,任何矩阵都可以通过相关字段的标量乘以元素.矩阵的主要应用是表示线性变换,即f(x)= 4 x等线性函数的推广.例如,旋转的载体在三维空间是一 ...

  4. java 数据分页

    分页逻辑 import lombok.Data; /** * User eric * Date * Email yq@aso.ren */ @Data public class PageHelper ...

  5. MyEclipse下安装FatJar打包工具

    方法一:help > software updates > Find and install > add > add remote site name:FatJar url:h ...

  6. 对于Mongodb数据库的学习

    数据库主要分为两种 1.关系型数据库(RDBS) 2.非关系性数据库(NoSQL) 而MongoDB就是非关系型数据库里的一种 文档型数据库(BSON) 文档型数据库(BSON)顾名思义就是以文档的形 ...

  7. 掌握numpy(一)

    NumPy是一款用于科学计算的python包,强大之处在于矩阵的运算以及包含丰富的线性代数运算的支持.本文将对numpy一些常用的用法进行讲解,一来是对自己的知识进行梳理,二来作为一份备忘录供以后查阅 ...

  8. python 有关datetime时间日期 以及时间戳转换

    直接上代码 其中有注释 #coding=utf-8 import time import datetime def yes_time(): #获取当前时间 now_time = datetime.da ...

  9. spring boot系列02--Thymeleaf+Bootstrap构建页面

    上一篇说了一下怎么构建spring boot 项目 接下来我们开始讲实际应用中需要用到的 先从页面说起 页面侧打算用Thymeleaf+Bootstrap来做 先共通模板页 <!DOCTYPE ...

  10. .net core 支付宝,微信支付 二

    源码: https://github.com/aspros-luo/Qwerty.Payment/tree/develop 今天开始微信支付 微信支付坑比较多,支付流程也不太一样,微信支付需要先生成预 ...