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):
随机推荐
- ECSHOP 商品评论条件修改——购买过该商品且只能评价一次(购买多少次能评价多少次)
下文转自http://bbs.ecshop.com/thread-1131529-1-1.html ECSHOP 商品评论条件修改,修改为购买过该商品多少次,就只能评价多少次.不需要修改数据库,原理简 ...
- 【英语】Bingo口语笔记(20) - i长短音
短音有个ei的音,多练习下 长音是咦拉长
- SeuRain的归来
不知不觉二十载寒窗苦读要结束了,还没有到回顾过去的时候.马上进入研三了,现在要努力加油了.还记得曾经的那个在凌晨两点奋战的宇么?归来吧!
- SpringMvc+jquery easyui模块开发7步骤
搞了一段java的开发,总结出模块开发经验: SpringMvc+jquery easyui模块开发7步骤:1) 数据表(table): 定义表结构并创建数据表t_use ...
- C# 阳历转农历
你妹的sb 原文 C#(ASP.NET)公历转农历的简单方法 Dot Net 平台,对全球化的支持做的非常好,不得不称赞一个 通常,将公历转为农历,是个非常烦的事情,需要整理闰年.闰月等的对照表. 在 ...
- DataReader方式 获取数据的操作
一.使用DataReader读取为对象List /// <summary> /// 获得数据列表List<>,DataReader 使用参数的 /// </summary ...
- Delphi 异或,英文为exclusive OR,或缩写成xor
异或,英文为exclusive OR,或缩写成xor 异或(xor)是一个数学运算符.它应用于逻辑运算.异或的数学符号为“⊕”,计算机符号为“xor”.其运算法则为: a⊕b = (¬a ∧ b) ∨ ...
- LR录制脚本IE不能打开解决方法
运行环境:win7 64位 解决方法:1.卸载IE11 2.计算机——属性——高级系统设置——性能里的设置——数据执行保护——选择“为除下列选定程序之外的所有程序和服务启用”——添加IE浏览器和VUG ...
- “内部类” 大总结(Java)
(本文整理自很久以前收集的资料(我只是做了排版修改),作者小明,链接地址没有找到,总之感谢,小明) (后面也对"静态内部类"专门做了补充) 内部类的位置: 内部类可以作用在方法里以 ...
- Python实现模拟登陆
大家经常会用Python进行数据挖掘的说,但是有些网站是需要登陆才能看到内容的,那怎么用Python实现模拟登陆呢?其实网路上关于这方面的描述很多,不过前些日子遇到了一个需要cookie才能登陆的网站 ...