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集合框架第二弹 二叉树的实现的更多相关文章

  1. My集合框架第一弹 LinkedList篇

    package com.wpr.collection; import java.util.ConcurrentModificationException; import java.util.Itera ...

  2. Java自学-集合框架 二叉树

    Java集合框架 二叉树 示例 1 : 二叉树概念 二叉树由各种节点组成 二叉树特点: 每个节点都可以有左子节点,右子节点 每一个节点都有一个值 package collection; public ...

  3. java基础之集合框架

    6.集合框架: (1)为什么出现集合类? 面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储. 集合就是存储对象最常用的一种方式. (2)数组和集合都是容器,两者有何不同 ...

  4. 黑马程序员——【Java基础】——集合框架

    ---------- android培训.java培训.期待与您交流! ---------- 一.集合框架概述 (一)集合框架中集合类关系简化图 (二)为什么出现集合类? 面向对象语言对事物的体现都是 ...

  5. JAVA基础学习之 Map集合、集合框架工具类Collections,Arrays、可变参数、List和Set集合框架什么时候使用等(4)

    package com.itcast.test20140113; import java.util.ArrayList; import java.util.Arrays; import java.ut ...

  6. Java集合框架(二)

    Set Set:无序,不可以重复元素. |--------HashSet:数据结构是哈希表. 线程是非同步的.保证元素唯一性的原理是:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的 ...

  7. Java集合框架学习笔记

    集合类的由来:对象用于封装特有数据,对象多了需要存储,如果对象的长度不确定,就使用集合存储. 集合特点1.用于存储对象的容器.2.集合的长度可变.3.集合中不可以存储基本类型 集合容器因为内部的数据结 ...

  8. java之集合框架使用细节及常用方法

    集合类的由来:   对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定.  就使用集合容器进行存储. 集合特点: 1,用于存储对象的容器. 2,集合的长度是可变的. 3,集合中不可以存储基本 ...

  9. Java集合框架类

    java集合框架类图 Collection接口(List.Set.Queue.Stack):

随机推荐

  1. 《C和指针》读书笔记 第3章-数据

    原创文章,转载请注明出处:http://www.cnblogs.com/DayByDay/p/3936488.html

  2. 使用Rxjava缓存请求

    最近,我尝试使用RxJava开发了一款闲时备份app.我必须承认,一旦你get到了正确的方式,RxJava几乎感觉就像作弊.一切看起来更简洁,多个请求能够被组合,且非常容易控制.通过在UI线程观察和在 ...

  3. org.hibernate.MappingException: duplicate import异常

    在开发hibernate时,一起多谢ORM类和映射文件时,报出:org.hibernate.MappingException: duplicate import com.XXX异常 解决方案: 检查你 ...

  4. 输出图片的php代码前面不能有空白行

    第一行增加一个空白行,就至少会输出一个换行符在图片数据流的前面而图片是按图片流提供的信息显示的,前面多了内容就无法解析了.

  5. LINUX下的tty,console与串口分析

    1.LINUX下TTY.CONSOLE.串口之间是怎样的层次关系?具体的函数接口是怎样的?串口是如何被调用的? 2.printk函数是把信息发送到控制台上吧?如何让PRINTK把信息通过串口送出?或者 ...

  6. 题目1003:A+B ---c_str(),atoi()函数的使用;remove , erase函数的使用

    #include<stdio.h> #include<stdlib.h> int sw(char *a){ ,c=; while(a[i]){ ') c=c*+a[i]-'; ...

  7. ScrollView中嵌套ListView

    scrollview中嵌入listview,要是直接把listview嵌进scrollview中,listview的高度是固定的不能进行滑动.默认情况下Android是禁止在ScrollView中放入 ...

  8. C# 类和结构

    类和结构实际上都是创建对象的模板,每个对象都包含数据,并提供了处理和访问数据的方法 . 类定义了类的每个对象(称为实例)可以包含什么数据和功能. 例如,如 果一个类表示一个顾客,就可以定义字段 Cus ...

  9. leetcode:Integer to Roman(整数转化为罗马数字)

    Question: Given an integer, convert it to a roman numeral. Input is guaranteed to be within the rang ...

  10. 黑马程序员——OC的内存管理学习小结

    内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...