二叉查找树--java
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的更多相关文章
- 数据结构实现(四)二叉查找树java实现
转载 http://www.cnblogs.com/CherishFX/p/4625382.html 二叉查找树的定义: 二叉查找树或者是一颗空树,或者是一颗具有以下特性的非空二叉树: 1. 若左子树 ...
- 递归的二叉查找树Java实现
package practice; public class TestMain { public static void main(String[] args) { int[] ao = {50,18 ...
- 二叉查找树 Java实现
定义: 一棵二叉查找树是一棵二叉树,每个节点都含有一个Comparable的键(以及对应的值). 每个节点的键都大于左子树中任意节点的键而小于右子树中任意节点的键. 树的术语: Name Functi ...
- 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 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 数据结构笔记--二叉查找树概述以及java代码实现
一些概念: 二叉查找树的重要性质:对于树中的每一个节点X,它的左子树任一节点的值均小于X,右子树上任意节点的值均大于X. 二叉查找树是java的TreeSet和TreeMap类实现的基础. 由于树的递 ...
- Java for LintCode 验证二叉查找树
给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值. 左右子树也必须是二叉查找树. ...
- 二叉查找树的Java实现
为了克服对树结构编程的恐惧感,决心自己实现一遍二叉查找树,以便掌握关于树结构编程的一些技巧和方法.以下是基本思路: [1] 关于容器与封装.封装,是一种非常重要的系统设计思想:无论是面向过程的函数,还 ...
- 二叉查找树(三)之 Java的实现
概要 在前面分别介绍了"二叉查找树的相关理论知识,然后给出了二叉查找树的C和C++实现版本".这一章写一写二叉查找树的Java实现版本. 目录 1. 二叉树查找树2. 二叉查找树的 ...
随机推荐
- nginx + uwsgi + django/flask Nginx + php-fpm + PHP
后端服务器设置nginx + uwsgi + django/flask需要注意的问题 - ACE开发者 https://acejoy.com/2018/09/09/547/ 后端开发应用中,除了Ngi ...
- javascript基础(整理自廖雪峰)
不要使用==比较,始终坚持使用===比较false == 0; //返回true. 这种情况, 它会自动转换数据类型再比较false === 0; //返回false. 建议用这种方式 NaN === ...
- 网络安装CentOS6.4
第一步:所需工具安装包下载地址: http://115.com/file/antbtamu#网络安装CentOS.rar(或者下载NetbootM.exe和hfs.exe) 第二步:将CentOS6. ...
- 利用jdk中工具完成Java程序监控方法记录
转载加自己整理的部分内容,转载自:http://jiajun.iteye.com/blog/810150 记录下JConsole使用方法 一.JConsole是什么 从Java 5开始 引入了 ...
- python并发编程&多线程(二)
前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...
- Oracle 报 ORA-21561: OID generation failed 错误 mac 链接oracle
简单的说:在终端输入:sudo scutil --set HostName localhost
- 玩转NumPy数组
一.Numpy 数值类型 1.前言:Python 本身支持的数值类型有 int(整型, long 长整型).float(浮点型).bool(布尔型) 和 complex(复数型).而 Numpy 支持 ...
- python之网络socket编程
一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...
- 调用AJAX返回JSON、XML数据类型
1.调用AJAX返回JSON数据 用下拉列表显示Nation表民族名称 主页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi ...
- $Android连续按返回键两次实现退出程序
思路:重写Activity的onKeyDown方法,判断按键是不是返回键,如果是,则再判断按下的时间和上次按下的时间之间的差值(毫秒数)是不是大于2000,如果不大于,则用finish()方法结束程序 ...