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. java读取本地文件

    File file = new File("F:/hejing/InstrumentJsonData.txt");        StringBuilder localStrBul ...

  2. PHP7-MySQLi在分页中的应用

    获取页码,设置每页行数 $page = $_POST["page"]; if($page == ""||$page <= 0){ $page = 1; } ...

  3. Qt 如何获取一个文件的 Icon 图标?

    #include <QPixmap> #include <QString> #include <QFileInfo> #include <QFileIconP ...

  4. javafx 普通弹框提示

    new Alert(Alert.AlertType.NONE, "xxx不存在", new ButtonType[]{ButtonType.CLOSE}).show();

  5. Maven学习笔记—仓库

    Maven仓库 1 什么是Maven仓库 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以成为构件,而Maven通常在某个位置统一的存储所有Maven项目共享的构件,这个统一的位置就是Ma ...

  6. 剑指offer 面试63题

    面试63题 题目:股票的最大利润 题:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16, ...

  7. Java Web项目在Mac系统上启动时提示nodename nor servname provided

    今天一不小心更新了Mac系统,然后在启动Java Web项目的时候,提示了java.net.UnknownHostException: MAC-mini-local nodename nor serv ...

  8. NodeJS 加入windows7服务 开机运行 nssm

    from:http://blog.sina.com.cn/s/blog_5ef5f2630101aql8.html 首先需要到http://nssm.cc/download/?page=downloa ...

  9. Nginx反向代理+负载均衡简单实现

    一.基础环境: 负   载  机:A机器: 192.168.71.223后端机器1:B机器:192.168.71.224后端机器2:C机器:192.168.71.226 需求: 1)访问A机器的808 ...

  10. 前端 JS&&DOM续

    JS续 1.序列化 JSON.stringify(obj)   序列化 JSON.parse(str)        反序列化 2.转义 decodeURI( )                   ...