二叉查找树--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. 二叉查找树的 ...
随机推荐
- Machine Learning - week 2 - 编程练习
3. % J = COMPUTECOST(X, y, theta) computes the cost of using theta as the % parameter for linear r ...
- 阿里巴巴java开发手册阅读笔记
1. long 或者 Long 初始赋值时,必须使用大写的 L. Long a = 2L; 2. POJO 类(DO/DTO/BO/VO )必须写 toString 方法 3. final 可提高程序 ...
- 内置函数:max 用法
内置函数——max Python max内置函数 max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the l ...
- 我的Android进阶之旅------>Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi")
Android中高低API版本兼容使用@TargetApi或者@SuppressLint("NewApi") 例如:AndroidManifest.xml中,我们配置了sdk版本的 ...
- vue 项目 npm install 报错解决
node-sass 安装报错解决办法 2017年04月15日 14:34:25 阅读数:20189 E:\kibana>npm install node-sass > node-sass@ ...
- 0401-服务注册与发现、Eureka简介
一.硬编码问题 解决方案:nginx.或.服务注册与发现 二.服务发现 注册.心跳机制 三.服务发现组件的功能 1.服务注册表:是一个记录当前可用服务实例的网络信息的数据库,是服务发现机制的核心.服务 ...
- 021-Spring Boot 测试,Junit方式使用,mock方式,Controller测试
一.概述 二.Junit方式使用 2.1.基本使用 eclipse在新建的类上,右键→new→Junit Test Case,修改一下Source folder,选择src/test/java,下一步 ...
- Python基础-时间模块和radom模块
时间模块 import time # 引入时间模块 print(time.time()) # 1508146954.9455004: 时间戳 print(time.clock()) # 计算CPU执行 ...
- SaltStack任务计划
编辑fansik_cron.sls文件: 内容如下: cron_test: cron.present: - name: /bin/touch /tmp/fansik.txt - user: root ...
- 剑指offer 面试27题
面试27题: 题目:二叉树的镜像 题:操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / ...