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. 基于jquery框架的ajax搜索显示

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  2. KVM虚拟化技术简介

    kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中.它使用Linux自身的调度器进行管理,所 ...

  3. jQuery基础知识--Form基础(续)

    下拉框应用 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF ...

  4. web-ylbtech-数据库备份-数据库设计

    ylbtech-DatabaseDesgin:web-ylbtech-数据库备份-数据库设计 DatabaseName:ylbtech Model:备份 Type:数据库备份设计 Url: 1.A,数 ...

  5. hdu5248 序列变换

    百度之星的题.其实最简单的方法是二分答案,我竟然没想到,直接去想O(n)的去了,最后导致滚粗... 题意就是给一个数列,要求把它处理成递增序列. 首先我想到了O(n^2)的算法,然后再优化成O(n)过 ...

  6. C语言练习代码

    1.运用for循环根据输入的金字塔层数,输出金字塔 eg: #include <stdio.h>int main(void){ int i,j,num; printf("请输入三 ...

  7. SQL跨数据库复制表数据

    SQL跨数据库复制表数据   不同服务器数据库之间的数据操作 不同数据库之间复制表的数据的方法: 当表目标表存在时: insert into 目的数据库..表 select * from 源数据库.. ...

  8. PHP 转义详解

    php中数据的魔法引用函数 magic_quotes_gpc  或 magic_quotes_runtime 设置为on时,为我们引用的数据碰到 单引号' 和 双引号" 以及 反斜线\ 时自 ...

  9. web前端笔试题

    1, 判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母.数字.下划线,总长度为5-20 var reg = /^[a-zA-Z][a-zA-Z_0-9]{4,19}$/; reg.test ...

  10. Masonry 实现输入框随键盘位置改变

    Github: https://github.com/saitjr/MasonryDemo 直接上代码: #import "ViewController4.h" #import & ...