- 浏览: 284529 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
CodeLove:
如果包含<,(,)...等特殊字符呢
Python变量名检测 -
zlxzlxzlxzlxzlx:
这不能算是任意进制之间的转换,只能算是 2、8、10、16 几 ...
java实现的任意进制转换 -
mychaoyue2011:
在本地执行了几遍,结果都是:s2开始休眠s1开始休眠s2休眠结 ...
Java线程学习笔记(四)线程join -
chxiaowu:
不错!
Java版的树 -
TenAclock:
这个例子 做不到“学生都交完” 考试结束,只能做到等到考试时间 ...
Java线程学习笔记(十一) DelayQueue的应用
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树。
定义了一个STreeNode,
package com.woxiaoe.collection.tree; /** * * @author 小e * * 2010-4-9 下午08:10:25 */ public class STreeNode<T> { private T nodeValue; private STreeNode<T> left; private STreeNode<T> right; private STreeNode<T> parent; public STreeNode(T value) { this.nodeValue = value; } public STreeNode(T nodeValue, STreeNode<T> parent) { this.nodeValue = nodeValue; this.parent = parent; } public T getNodeValue() { return nodeValue; } public void setNodeValue(T nodeValue) { this.nodeValue = nodeValue; } public STreeNode<T> getLeft() { return left; } public void setLeft(STreeNode<T> left) { this.left = left; } public STreeNode<T> getRight() { return right; } public void setRight(STreeNode<T> right) { this.right = right; } public STreeNode<T> getParent() { return parent; } public void setParent(STreeNode<T> parent) { this.parent = parent; } }
STree
package com.woxiaoe.collection.tree;
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* 二叉排序树
* @author 小e
*
* 2010-4-9 下午08:09:14
*/
public class STree<T> implements Collection<T> {
private int treeSize;
private STreeNode<T> root;
public STree() {
this.treeSize = 0;
root = null;
}
@Override
public boolean add(T t) {
STreeNode<T> node = root,newNode,parent = null;
int result = 0;
while(node != null){
parent = node;
result = ((Comparable<T>)node.getNodeValue()).compareTo(t);
if(result == 0){
return false;
}
if(result > 0){//往左
node = node.getLeft();
}else{
node = node.getRight();
}
}
newNode = new STreeNode<T>(t);
if(parent == null){//第一个进来的元素
root = newNode;
}else if(result > 0){
parent.setLeft(newNode);
}else{
parent.setRight(newNode);
}
newNode.setParent(parent);
treeSize ++;
return true;
}
@Override
public boolean addAll(Collection<? extends T> c) {
boolean flag = false;
for (Iterator iterator = c.iterator(); iterator.hasNext();) {
T t = (T) iterator.next();
add(t);
flag = true;
}
return flag;
}
@Override
public void clear() {
// TODO Auto-generated method stub
}
@Override
public boolean contains(Object o) {
if(findNode((T) o) != null){
return true;
}
return false;
}
@Override
public boolean containsAll(Collection<?> c) {
for (Iterator iterator = c.iterator(); iterator.hasNext();) {
T t = (T) iterator.next();
if(findNode(t) == null){
return false;
}
}
return true;
}
@Override
public boolean isEmpty() {
return treeSize == 0;
}
@Override
public Iterator<T> iterator() {
return new IteratorImpl();
}
@Override
public boolean remove(Object o) {
STreeNode<T> node = findNode((T)o);
if(node == null){
return false;
}
treeSize --;
return removeNode(node);
}
@Override
public boolean removeAll(Collection<?> c) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean retainAll(Collection<?> c) {
// TODO Auto-generated method stub
return false;
}
@Override
public int size() {
return treeSize;
}
@Override
public Object[] toArray() {
Object[] array = new Object[treeSize];
int index = 0;
for (Iterator iterator = this.iterator(); iterator.hasNext();) {
T o = (T) iterator.next();
array[index++] = o;
}
return array;
}
@Override
public <T> T[] toArray(T[] a) {
// TODO Auto-generated method stub
return null;
}
private STreeNode<T> findNode(T item){
STreeNode<T> node = root;
int value = 0;
while(node != null){
value = ((Comparable<T>)node.getNodeValue()).compareTo(item);
if(value == 0){
return node;
}else if(value > 0){
node = node.getLeft();
}else{
node = node.getRight();
}
}
return null;
}
/**
* 删除节点
* @param node
* @return
*/
private boolean removeNode(STreeNode<T> node){
STreeNode<T> pNode,rNode;//node的父节点,和node的子节点
/**
* 情况一,当节点至少有一棵空子树
*/
if(node.getLeft() == null || node.getRight() == null){
pNode = node.getParent();
if(node.getLeft() == null){
rNode = node.getRight();
}else{
rNode = node.getLeft();
}
if(rNode != null){
rNode.setParent(pNode);//将r的父节点指向p
}
if(pNode == null){//node为root节点
root = rNode;
}else if(((Comparable<T>)pNode.getNodeValue()).compareTo(node.getNodeValue()) < 0){
pNode.setRight(node);
}else{
pNode.setLeft(node);
}
}else{
rNode = node.getRight();
pNode = node;
/**
* 找到node的右子树中最大于node的最小值
*/
while(rNode.getLeft() != null){
pNode = rNode;
rNode = rNode.getLeft();
}
/**
* 交换值
*/
node.setNodeValue(rNode.getNodeValue());
if(pNode == node){//node 的下一结点 没有节点
node.setRight(rNode.getRight());//
}else{
pNode.setLeft(rNode.getRight());
}
/**
* 将rNode的右子树 的 parent 接到pNode下
*/
if(rNode.getRight() != null){
rNode.getRight().setParent(pNode);
}
}
return true;
}
/**
* 取最大值
* @return
*/
public T maxValue(){
STreeNode<T> node = root;
while(node.getRight() != null){
node = node.getRight();
}
return node == null?null:node.getNodeValue();
}
public T minValue(){
STreeNode<T> node = root;
while(node.getLeft() != null){
node = node.getLeft();
}
return node == null?null:node.getNodeValue();
}
public STreeNode<T> getRoot() {
return root;
}
public void setRoot(STreeNode<T> root) {
this.root = root;
}
private class IteratorImpl implements Iterator<T>{
STreeNode<T> nextNode,returnNode,pNode;
public IteratorImpl() {
nextNode = root;
//选择最小节点
if(nextNode != null){
while(nextNode.getLeft() != null){
nextNode = nextNode.getLeft();
}
}
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return nextNode != null;
}
@Override
public T next() {
if(nextNode == null){
throw new NoSuchElementException("没有该元素");
}
returnNode = nextNode;
if(nextNode.getRight() != null){
nextNode = nextNode.getRight();
while(nextNode.getLeft() != null){
nextNode = nextNode.getLeft();
}
}else{
/**
* 如果右子树为空,沿着父节点的引用,直至查到当前节点nextNode作为pNode的左节点是停止
* pNode就为就为下一个要访问的点
*/
pNode = nextNode.getParent();
//但pNode不是根结点 且 当前节点为 pNode的右节点
while(pNode != null && nextNode == pNode.getRight()){
nextNode = pNode;
pNode = pNode.getParent();
}
nextNode = pNode;
}
return returnNode.getNodeValue();
}
@Override
public void remove() {
throw new UnsupportedOperationException("不支持该方法 ");
}
}
}
测试类
package com.woxiaoe.collection.tree; import java.util.Iterator; import java.util.Random; import junit.framework.TestCase; /** * 二叉排序树测试 * @author 小e * * 2010-4-9 下午08:32:55 */ public class STreeTest extends TestCase { STree<Integer> tree = new STree<Integer>(); int[] data = new int[]{40,30,65,25,35,50,10,26,33,29,34}; @Override protected void setUp() throws Exception { Random r = new Random(); int value; int len = data.length; for(int i = 0; i < len; i++){ value = r.nextInt(100); //tree.add(value); tree.add(data[i]); } } public void testSTree(){ LNR(tree.getRoot()); } public void testFind(){ for(int i = 0; i < 15; i++){ System.out.println("i" + i + "\t" + tree.contains(i)); } } /** * 测试删除节点 */ public void testDelete(){ System.out.println("删除前:"); LNR(tree.getRoot()); tree.remove(40); System.out.println("删除节点30:" ); LNR(tree.getRoot()); } public void testMaxAndMin(){ System.out.println("max:" + tree.maxValue()); System.out.println("min:" + tree.minValue()); } /** * 测试迭代 */ public void testTreeIterator(){ for (Iterator iterator = tree.iterator(); iterator.hasNext();) { Integer i = (Integer) iterator.next(); System.out.print(i + " "); } } /** * 中序排列 * @param node */ public void LNR(STreeNode node){ if(node == null){ return; } LNR(node.getLeft()); visit(node); LNR(node.getRight()); } private void visit(STreeNode node){ System.out.print(node.getNodeValue() + " "); } }
Output
10 25 26 29 30 33 34 35 40 50 65 i0 false i1 false i2 false i3 false i4 false i5 false i6 false i7 false i8 false i9 false i10 true i11 false i12 false i13 false i14 false 删除前: 10 25 26 29 30 33 34 35 40 50 65 删除节点30: 10 25 26 29 30 33 34 35 50 65 max:65 min:10 10 25 26 29 30 33 34 35 40 50 65
发表评论
-
Consider the following code: What will be printed?
2010-09-24 20:30 986Consider the following code: Wh ... -
Java 基础复习笔记一
2010-06-04 02:03 1152这两天复习java的基础知识,把一些自己认为比较有用的点记录下 ... -
Java 转义字符
2010-06-03 21:21 1022\n 回车(\u000a) \t 水平制表符(\u0009) ... -
生产消费者的模拟
2010-05-27 23:16 1720采用Java 多线程技术,设计实现一个符合生产者和消费者问题的 ... -
Java 控制台下显示文件结构
2010-05-27 00:10 3283题目: 编写一个Java ... -
Java得到类目录
2010-05-26 23:22 1198String path = MainTest.class.ge ... -
Java文件压缩
2010-05-23 21:54 1242package com.woxiaoe.study.io ... -
UDP传输图片的尝试
2010-05-22 18:05 9863UDP是不可靠的,发送的数据不一定会到达,且顺序不一定 ... -
【转载】Java String.Format() 方法及参数说明
2010-05-15 22:18 1346JDK1.5中,String类新增了一个很有用的静态方法S ... -
【转载】String.format函数使用方法介绍
2010-05-15 22:17 1221http://edu.codepub.com/2009/111 ... -
Java线程学习笔记(十一) DelayQueue的应用
2010-05-01 00:34 15736DelayQueue 是一个无界的BlockingQueue ... -
Java线程学习笔记(十)CountDownLatch 和CyclicBarrier
2010-04-30 21:04 2879CountDownLatch : 一个同步辅助类,在完成一组 ... -
Java线程学习笔记(九)生产者消费者问题
2010-04-29 22:27 1753用多线程来模拟生产者消费者问题。用到BlockingQueue ... -
Java线程学习笔记(八)线程之间的协作
2010-04-26 23:13 1865wait()与notifyAll() 调用sleep ... -
Java线程学习笔记(七)java中递增不是原子性
2010-04-24 23:00 2941以下为测试代码,通过一个自增函数得到最新的值,玩Set你存,看 ... -
Java线程学习笔记(六)在其他对象上同步
2010-04-24 22:47 1381package com.woxiaoe.study.threa ... -
Java线程学习笔记(五)资源共享问题
2010-04-24 21:04 1297IncreaseClient 中持有一个base,每次调用起i ... -
Java线程学习笔记(四)线程join
2010-04-24 20:06 1317《Java编程思想》的一个例子,如果某个线程在另一个线程t上调 ... -
基于java的图(四) 强连通组件
2010-04-22 21:06 1565有向图中, u可达v不一定意味着v可达u. 相互可达则属于同一 ... -
基于java的图(三) 图的拓扑排序
2010-04-21 16:14 1903相关: 基于java的图的实现 基于java ...
相关推荐
java实现二叉搜索树,包括插入和查找等基本功能
二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉排序树中,对于...
这段代码展示了构建一个基本的二叉搜索树(Binary Search Tree, BST)的实现。二叉搜索树是一种特殊的二叉树,其中每个节点的值大于其左子树中所有节点的值,并且小于其右子树中所有节点的值。这种数据结构在查找、...
Java 实现二叉搜索树功能 二叉搜索树是一种特殊的二叉树,它的每个节点都含有一个Comparable的键值,且所有的键值都是唯一的,节点的键值也可以是基本类型,如int、long等,也可以是自定义的对象类型,只要实现了...
Java 创建二叉搜索树、实现搜索、插入、删除的操作实例 Java 创建二叉搜索树是指通过 Java 语言实现一个二叉搜索树数据结构,该树具有查找、插入、删除等操作的功能。二叉搜索树是一种特殊的二叉树,每个节点的值...
以下是Java实现二叉搜索树的查找、插入、删除和遍历的关键点: 1. **查找节点**: - 查找操作基于二叉搜索树的性质,从根节点开始,如果目标键值小于当前节点的键值,就向左子树移动;如果目标键值大于当前节点的...
`BST.java`很可能是二叉搜索树的实现,`TreeDoc.java`可能包含了关于数据结构或树操作的文档,而`BSTMain.java`应该是主程序,用于测试和展示二叉搜索树的功能。 在`BST.java`中,二叉搜索树的节点可能包含以下属性...
二叉排序树(Binary Sort Tree,也称为二叉搜索树),是数据结构中的一种特殊类型树,它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。...
在Java中实现二叉排序树,我们需要定义一个Node类来表示树的节点,包含键值、左子节点和右子节点。然后创建一个BST类,包含插入、查找和删除等基本操作。以下是一个简单的Java实现: ```java public class Node { ...
在Java中实现二叉搜索树,通常会定义一个`Node`类来表示树的节点,包含键、值、左子节点和右子节点等属性。接着,可以创建一个`BinarySearchTree`类,其中包含插入、查找和删除等方法。以下是一个简单的二叉搜索树的...
在Java中实现二叉搜索树,通常会定义一个名为`Node`的类来表示树的节点,包含键、值以及指向左右子节点的引用。接下来,我们创建一个名为`BinarySearchTree`的类,它包含了对树进行操作的主要方法,如插入、查找和...
其次,二叉平衡树(AVL树)是最早被提出的自平衡二叉搜索树,由G. M. Adelson-Velsky和E. M. Landis于1962年提出。AVL树要求每个节点的两个子树的高度差不超过1,以确保树的高度保持在log2(n+1)的范围内。为了维持这...
二叉查找树的实现。包括树的平衡以及树节点的删除。以及树的广度优先遍历,深度优先遍历。
二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树结构,其每个节点的值都大于左子树中所有节点的值,...这个转换过程对于理解和实现二叉搜索树到链表的转换具有重要意义,有助于提升对数据结构和算法的理解。
在JAVA中,构建二叉搜索树通常需要定义一个Node类来表示树的节点,节点通常包含一个键值(key)、一个指向左子节点的引用和一个指向右子节点的引用。例如: ```java public class Node { int key; Node left, ...
本文将详细解释如何将有序数组转换为二叉搜索树,包括问题描述、解题思路、Java 和 Python 实现代码以及时间和空间复杂度分析。 问题描述 给定一个整数数组 nums,其中元素已经按升序进行了排序,请将其转换为一棵...
C、C++和Java实现二叉查找树时,通常会定义一个结构体(或类)来表示树节点,包括键值、指向左右子节点的指针以及可能的额外信息。对于C++和Java,还可以使用面向对象的方式,定义一个类来封装插入、查找和删除的...
为了优化这种情况,可以使用自平衡二叉搜索树,如AVL树和红黑树,它们在任何情况下都能保证较好的性能。 以上就是关于Java实现二叉排序树的基本介绍,具体实现可以参考提供的`BinarySortTree.java`文件。在实际应用...
在Java中实现二叉搜索树,我们需要定义一个`Node`类来表示树的节点,通常包括键、值、左子节点和右子节点。接着,我们需要一个`BinarySearchTree`类来操作这些节点,包含插入、查找、删除等基本操作。 例如,在`src...
在Java中,查询二叉搜索树的最大元素和最小元素可以通过递归的方式实现。下面是查询二叉搜索树的最小节点和最大节点的方法: 1.1 查询二分搜索树的最小节点 public E minimum() { if (size == 0) { throw new ...