My集合框架第二弹 二叉树的实现
package com.wpr.collection;
import java.util.NoSuchElementException;
public class BinarySearchTree<AnyType extends Comparable<? super AnyType>> {
private static class BinaryNode<AnyType> {
AnyType element;
BinaryNode<AnyType> left;
BinaryNode<AnyType> right;
public BinaryNode(AnyType element) {
this(element,null,null);
}
public BinaryNode(AnyType element2,BinaryNode<AnyType> left, BinaryNode<AnyType> right) {
this.element = element2;
this.left = left;
this.right = right;
}
}
private BinaryNode<AnyType> root;
public BinarySearchTree() {
root = null;
}
public void makeEmpty() {
root = null;
}
public boolean isEmpty() {
return root == null;
}
/**
* 查找二叉树中是否含有x
*
* @param x
* @return
*/
public boolean contains(AnyType x) {
return contains(x, root);
}
/**
* 元素x是否包含在root的树中,递归的方式
*
* @param x
* @param root2
* @return
*/
/*
* private boolean contains(AnyType x, BinaryNode<AnyType> root) { if(root
* == null) return false;
*
* int compareResult = x.compareTo(root.element);
*
* if(compareResult>0) return contains(x,root.right); else
* if(compareResult<0) return contains(x,root.left); else return true; }
*/
/**
* 元素x是否包含在root的树中,非递归的方式
*
* @param x
* @param root2
* @return
*/
private boolean contains(AnyType x, BinaryNode<AnyType> root) {
while (root != null) {
if (root == null)
return false;
int compareResult = x.compareTo(root.element);
if (compareResult > 0)
root = root.right;
else if (compareResult < 0)
root = root.left;
else
return true;
}
return false;
}
/**
* 查找二叉树中的最小元素
* @return
*/
public AnyType findMin(){
if(isEmpty())
throw new NoSuchElementException();
return findMin(root).element;
}
/**
* 查找以p为根的二叉树中的最小值
* @param p
* @return
*/
private BinaryNode<AnyType> findMin(BinaryNode<AnyType> p) {
while(p.left!=null){
p=p.left;
}
return p;
}
/**
* 查找二叉树中的最大元素
* @return
*/
public AnyType findMax(){
if(isEmpty())
throw new NoSuchElementException();
return findMax(root).element;
}
/**
* 查找以p为根的二叉树中的最大值
* @param p
* @return
*/
private BinaryNode<AnyType> findMax(BinaryNode<AnyType> p) {
while(p.right!=null){
p=p.right;
}
return p;
}
/**
* 在二叉树中插入一个新的节点
* @param x
*/
public void insert(AnyType x){
root = insert(x,root);
}
/**
* 将新节点x插入到以p为根节点的二叉树中,递归的方式
* @param x 新节点
* @param p 根节点
* @return 存在不插入,不存在按照顺序插入
*/
private BinaryNode<AnyType> insert(AnyType x, BinaryNode<AnyType> p) {
//根节点为null的情况
if(p==null)
return new BinaryNode<AnyType>(x,null,null);
int compareResult = x.compareTo(p.element);
if (compareResult > 0)
p.right = insert(x,p.right);
else if (compareResult < 0)
p.left = insert(x,p.left);
return p;
}
/**
* 将数据x,从二叉树中删除
* @param x
*/
public void remove(AnyType x){
root = remove(x,root);
}
/**
* 从以p为根节点的二叉树中删除元素x
* 存在以下情况:
* 1.不存在要删除的节点,返回null
* 2.要删除的节点是叶子节点,直接删除
* 3.要删除的节点有一个儿子节点,将该节点的父节点调整链绕过该节点即可
* 4.要删除的节点有两个儿子,采用右子树的最小的数据代替该节点的数据,并递归地删除那个节点(该最小节点无左节点)
* @param x 要删除的节点
* @param p 根节点
* @return
*/
private BinaryNode<AnyType> remove(AnyType x, BinaryNode<AnyType> p) {
//元素x没在树中,返回null
if(p==null)
return null;
int compareResult = x.compareTo(p.element);
if (compareResult > 0)
p.right = remove(x,p.right);
else if (compareResult < 0)
p.left = remove(x,p.left);
else if(p.left!=null&&p.right!=null){
//存在2个儿子节点
BinaryNode<AnyType> minNode = findMin(p.right);
p.element = minNode.element;
p.right = remove(p.element,p.right);
}else
p=(p.left!=null)?p.left:p.right;
return p;
}
/**
* 打印树
*/
public void printTree(){
if(isEmpty()){
System.out.println("Empty Tree");
}
printTree(root);
}
/**
* 中序遍历树
* @param t
*/
private void printTree(BinaryNode<AnyType> t) {
if(t!=null){
System.out.print(t.element+"\t");
printTree(t.left);
printTree(t.right);
}
}
}
My集合框架第二弹 二叉树的实现的更多相关文章
- My集合框架第一弹 LinkedList篇
package com.wpr.collection; import java.util.ConcurrentModificationException; import java.util.Itera ...
- Java自学-集合框架 二叉树
Java集合框架 二叉树 示例 1 : 二叉树概念 二叉树由各种节点组成 二叉树特点: 每个节点都可以有左子节点,右子节点 每一个节点都有一个值 package collection; public ...
- java基础之集合框架
6.集合框架: (1)为什么出现集合类? 面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储. 集合就是存储对象最常用的一种方式. (2)数组和集合都是容器,两者有何不同 ...
- 黑马程序员——【Java基础】——集合框架
---------- android培训.java培训.期待与您交流! ---------- 一.集合框架概述 (一)集合框架中集合类关系简化图 (二)为什么出现集合类? 面向对象语言对事物的体现都是 ...
- JAVA基础学习之 Map集合、集合框架工具类Collections,Arrays、可变参数、List和Set集合框架什么时候使用等(4)
package com.itcast.test20140113; import java.util.ArrayList; import java.util.Arrays; import java.ut ...
- Java集合框架(二)
Set Set:无序,不可以重复元素. |--------HashSet:数据结构是哈希表. 线程是非同步的.保证元素唯一性的原理是:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的 ...
- Java集合框架学习笔记
集合类的由来:对象用于封装特有数据,对象多了需要存储,如果对象的长度不确定,就使用集合存储. 集合特点1.用于存储对象的容器.2.集合的长度可变.3.集合中不可以存储基本类型 集合容器因为内部的数据结 ...
- java之集合框架使用细节及常用方法
集合类的由来: 对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定. 就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本 ...
- Java集合框架类
java集合框架类图 Collection接口(List.Set.Queue.Stack):
随机推荐
- Sqlserver高级查询
1.查询表结构 --查询表结构(字段名.字段类型.字段长度.能否为空) SELECT syscolumns.name,systypes.name, syscolumns.length ,syscolu ...
- (二)win7下用Intelij IDEA 远程调试spark standalone 集群
关于这个spark的环境搭建了好久,踩了一堆坑,今天 环境: WIN7笔记本 spark 集群(4个虚拟机搭建的) Intelij IDEA15 scala-2.10.4 java-1.7.0 版本 ...
- (六)6.13 Neurons Networks Implements of stack autoencoder
对于加深网络层数带来的问题,(gradient diffuse 局部最优等)可以使用逐层预训练(pre-training)的方法来避免 Stack-Autoencoder是一种逐层贪婪(Greedy ...
- 【英语】Bingo口语笔记(36) - ʌn的发音
同样音标 读音相同 找最有把握的一个词
- 【阅读】提问的智慧+有效的报告BUG
这两项可谓是我们测试人员的基本要求了,不过实话说的是,我自己这两方面很薄弱.哎!!! 这两篇文章都看过了,不过我在这也记个笔记吧.督促自己!!! <提问的智慧> <如何有效地报告Bu ...
- Php 笔记1-----request和 response
不能大于2KB 第一次学习 php, 因为以前习惯了 .net, 所以 刚开始总是按照.net的 思路去思考, 怎么获取 客户端发过来的 request对象啊, 怎么设置response啊.. ...
- LoadRunner界面分析(二)
1.Controller 2.创建运行场景 3.方案设计 4.Resuls settting 5.监视方案
- 安卓 开发 The connection to adb is down, and a severe error has occured.
The connection to adb is down, and a severe error has occured.问题解决 其原因就是其他进程占用了 ADB的端口,所以无法启动 遇到问题描 ...
- STL六大组件之——算法小小小小的解析
参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...
- 【JNI】OPUS压缩与解压的JNI调用(.DLL版本)
OPUS压缩与解压的JNI调用(.DLL版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...