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):
随机推荐
- Matlab中plot函数参数解析
功能 二维曲线绘图 语法 plot(Y) plot(X1,Y1,...) plot(X1,Y1,LineSpec,...) plot(...,'PropertyName',PropertyValue, ...
- dede 去power by dedecms
include/dedesql.class.php 下的$arrs1和$arrs2的全注释掉
- MornUI 源码阅读笔记
1. label的mouseChildren属性为true,但label本身是不需要监听textfield的任何事件的, 个人猜测是为了给TextInput, TextArea用的,因为后两者需要监听 ...
- 一天一个Java基础——通过异常处理错误
<Thinking in Java>上对这章的讲解不少,可见重要性,学习和总结一些主要的记录下来. 一.创建自定义异常 package Exception; class SimpleExc ...
- WCF服务通过防火墙怎么设置
设置防火墙 1.首先点击控制面板->系统与安全->Window防火墙->点击允许程序通过Windows防火墙 2.查找Windows Communication Foundation ...
- 44、自定义仿IOS对话框
private Dialog myDialog = null; private void ExitLogin() { View view = LayoutInflater.from(MainActiv ...
- Eclipse的SVN插件安装
两种方法: 首先下载安装到eclipse的svn插件包,包里会有“plugins”和“features”两个文件夹,安装时要用到. 1.然后找到eclipse目录下的同名文件夹“plugins”和“f ...
- kali linux 一些工具及命令集1(搜集DNS信息)
DNS信息收集 1.dnsdict6 用于查看ipv6的dns信息,国内很少ipv6,基本无用 2.dnsmap 收集dns信息,同类别还有dnsenum,dnswalk 使用dnsmap需先找到 ...
- C# 保留2位小数
1.只要求保留N位不四舍5入 float f = 0.55555f; int i =(int)(f * 100); ...
- The remote SSH server rejected X11 forwarding request
两台相同的虚拟机,一台没有错误,一个经常出现警告,内容如下所示: The remote SSH server rejected X11 forwarding request 找了很多方法,最后发现是安 ...