package com.test.tree;

public class BinarySearchTree<T extends Comparable<? super T>> {
/*定义二叉树的节点*/
private class BinaryNode<T>{
public T data;
public BinaryNode<T> lt;
public BinaryNode<T> rt; public BinaryNode(T data) {
this(data, null, null);
}
public BinaryNode(T data, BinaryNode<T> lt, BinaryNode<T> rt) {
this.data = data;
this.lt = lt;
this.rt = rt;
}
} private BinaryNode<T> root; //定义二叉查找树的根节点 public BinarySearchTree(){ //初始化二叉查找树
root = null;
} public void makeEmpty(){ //树清空
root = null;
} public boolean isEmpty(){ //树判空
return root == null;
} public boolean contains(T x){ //判断是否包含某个值
return contains(root, x);
}
public boolean contains(BinaryNode<T> root, T x){
if(root == null){
return false;
}
int compare = x.compareTo(root.data);
if(compare == 0){
return true;
}else if(compare < 0){
contains(root.lt, x);
}else {
contains(root.rt, x);
}
return false;
} public T findMin(){ //获得树中最小值
if(!isEmpty()){
return findMin(root).data;
}
return null;
}
public T findMax(){ //获得树中最大值
if(!isEmpty()){
return findMax(root).data;
}
return null;
} public void insert(T data){ //插入数据
root = insert(data, root);
} public void remove(T data){
root = remove(data, root);
} public void printTree(){
if(root == null){
System.out.println("empty tree");
}else{
printTree(root);
}
}
/*中序遍历*/
public void printTree(BinaryNode<T> t){
if(t != null){
printTree(t.lt);
System.out.print(t.data+"、");
printTree(t.rt);
}
}
/**
* 删除查找树的某个节点,首先用要删除节点的右子树中最小值替换节点值,
* 再从右子树中删除此节点,递归调用
* */
public BinaryNode<T> remove(T data, BinaryNode<T> t){
if(t == null){
return t;
}
int compare = data.compareTo(t.data); if(compare < 0){
//插入值比根节点的值小,插入到左字数
t.lt = remove(data, t.lt);
}else if(compare > 0){
//插入值比根节点的值小,插入到左字数
t.rt = remove(data, t.rt);
}else if(t.lt != null && t.rt != null){
t.data = findMin(t.rt).data; //将右子树中的最小值赋给要删除的节点
t.rt = remove(t.data, t.rt);
}else{
t = t.lt == null? t.rt:t.lt;
}
return t;
}
public BinaryNode<T> insert(T data, BinaryNode<T> t){
if(t == null){
return new BinaryNode<T>(data, null, null);
}
int compare = data.compareTo(t.data);
if(compare < 0){
//插入值比根节点的值小,插入到左字数
t.lt = insert(data, t.lt);
}else if(compare > 0){
//插入值比根节点的值小,插入到左字数
t.rt = insert(data, t.rt);
}else{
}
return t;
}
public BinaryNode<T> findMin(BinaryNode<T> t){
if(t == null){
return t;
}else if(t.lt == null){ //查找树的左边比节点值小,找到最左边的节点即可
return t;
}else{
return findMin(t.lt);
}
} public BinaryNode<T> findMax(BinaryNode<T> t){
if(t == null){
return null;
}else if(t.rt == null){ //查找树的右边比节点值大,找到最右边的节点即可
return t;
}
return findMax(t.rt);
} public static void main(String[] args) {
BinarySearchTree<Integer> binarySearchTree = new BinarySearchTree<Integer>();
binarySearchTree.insert(8);
binarySearchTree.insert(4);
binarySearchTree.insert(6);
binarySearchTree.insert(3);
binarySearchTree.insert(14);
binarySearchTree.insert(10);
System.out.println("最小值: "+binarySearchTree.findMin());
System.out.println("最大值: "+binarySearchTree.findMax());
binarySearchTree.printTree();
binarySearchTree.remove(8);
System.out.println();
binarySearchTree.printTree();
}
}

二叉查找树--java的更多相关文章

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

    转载 http://www.cnblogs.com/CherishFX/p/4625382.html 二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树 ...

  2. 递归的二叉查找树Java实现

    package practice; public class TestMain { public static void main(String[] args) { int[] ao = {50,18 ...

  3. 二叉查找树 Java实现

    定义: 一棵二叉查找树是一棵二叉树,每个节点都含有一个Comparable的键(以及对应的值). 每个节点的键都大于左子树中任意节点的键而小于右子树中任意节点的键. 树的术语: Name Functi ...

  4. LeetCode96_Unique Binary Search Trees(求1到n这些节点能够组成多少种不同的二叉查找树) Java题解

    题目: Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For e ...

  5. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  6. 数据结构笔记--二叉查找树概述以及java代码实现

    一些概念: 二叉查找树的重要性质:对于树中的每一个节点X,它的左子树任一节点的值均小于X,右子树上任意节点的值均大于X. 二叉查找树是java的TreeSet和TreeMap类实现的基础. 由于树的递 ...

  7. Java for LintCode 验证二叉查找树

    给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值.    节点的右子树中的值要严格大于该节点的值.    左右子树也必须是二叉查找树. ...

  8. 二叉查找树的Java实现

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

  9. 二叉查找树(三)之 Java的实现

    概要 在前面分别介绍了"二叉查找树的相关理论知识,然后给出了二叉查找树的C和C++实现版本".这一章写一写二叉查找树的Java实现版本. 目录 1. 二叉树查找树2. 二叉查找树的 ...

随机推荐

  1. asp.net mvc全局错误处理

    方式一:全局捕获异常 根据错误编码直接跳转到对应静态页面 1,在Global.asax.cs文件中添加错误处理方法Application_Error 代码如下 protected void Appli ...

  2. 【转】 HMC与VIOS对新LPAR提供存储与网络虚拟化的支持

    前面的几篇博文的操作环境都是在IVM下,IVM可以看作是VIOS的一部分,或者是对VIOS功能的一个扩展,一个IVM只能管理1台物理服务器,而HMC则是一对多.在有HMC来管理物理服务器的情形下,VI ...

  3. python函数的学习笔记

    这篇文章是我关于学习python函数的一些总结 一.随着函数的引入,这里首先要说的就是全局变量和局部变量了. 什么是全局变量.什么是局部变量: 全局变量就是全局都能调用的变量,一般都在文件的开头,顶头 ...

  4. 2014-08-28——Android和IOS的简单嗅探,以及横竖屏的捕获思路

    一般通过navigator.userAgent来嗅探Android系统和IOS系统: if(/android/i.test(navigator.userAgent)){ //android } if( ...

  5. PAT 1070. 结绳(25)

    给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连.每次串连后,原来两段绳子的长度 ...

  6. 交换机/路由器上的 S口 F口 E口

    S口是serial接口的意思,也叫高速异步串口,主要是连接广域网的V.35线缆用的,说白了就是路由器和路由器连接时候用的,可以用命令设置带宽,一般也就在10M.8M左右.F口是FastEthernet ...

  7. Python之模块和包(Day21)

    一.Python模块 Python模块(module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句. 模块让你能够有逻辑的组织你的Python代码段 把相关的代 ...

  8. Spring笔记:事务管理

    Spring笔记:事务管理 事务管理 Spring事务管理是通过SpringAOP去实现的.默认情况下Spring在执行方法抛出异常后,引发事务回顾,当然你可以用拦截器或者配置去改变它们. 这部门内容 ...

  9. JavaScript:学习笔记(3)——正则表达式的应用

    JavaScript:正则表达式的应用 应用正则表达式对象RegExp 创建正则表达式 JavaScript中使用RegExp对象来表述一个正则表达式.使用正则表达式之前首先要创建一个RegExp对象 ...

  10. SpringMVC:学习笔记(7)——验证器(JSR303)

    JSR 303(Bean Validation ) 说明: 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情.应用程序必须通过某种手段来确保输入进来的数据从语义上来讲是 ...