`
woxiaoe
  • 浏览: 283271 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java实现的二叉搜索树

    博客分类:
  • Java
阅读更多

若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

它的左、右子树也分别为二叉排序树。 

 

定义了一个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

2
1
分享到:
评论

相关推荐

    java实现二叉搜索树

    java实现二叉搜索树,包括插入和查找等基本功能

    Java实现二叉排序树

    二叉排序树(Binary Sort Tree,BST),也称为二叉搜索树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子节点的指针和一个指向右子节点的指针。在二叉排序树中,对于...

    使用Java实现二叉搜索树

    这段代码展示了构建一个基本的二叉搜索树(Binary Search Tree, BST)的实现。二叉搜索树是一种特殊的二叉树,其中每个节点的值大于其左子树中所有节点的值,并且小于其右子树中所有节点的值。这种数据结构在查找、...

    java实现 二叉搜索树功能

    Java 实现二叉搜索树功能 二叉搜索树是一种特殊的二叉树,它的每个节点都含有一个Comparable的键值,且所有的键值都是唯一的,节点的键值也可以是基本类型,如int、long等,也可以是自定义的对象类型,只要实现了...

    Java创建二叉搜索树,实现搜索,插入,删除的操作实例

    Java 创建二叉搜索树、实现搜索、插入、删除的操作实例 Java 创建二叉搜索树是指通过 Java 语言实现一个二叉搜索树数据结构,该树具有查找、插入、删除等操作的功能。二叉搜索树是一种特殊的二叉树,每个节点的值...

    Java 实现二叉搜索树的查找、插入、删除、遍历

    以下是Java实现二叉搜索树的查找、插入、删除和遍历的关键点: 1. **查找节点**: - 查找操作基于二叉搜索树的性质,从根节点开始,如果目标键值小于当前节点的键值,就向左子树移动;如果目标键值大于当前节点的...

    二叉搜索树的源码,加上注释和自己理解

    `BST.java`很可能是二叉搜索树的实现,`TreeDoc.java`可能包含了关于数据结构或树操作的文档,而`BSTMain.java`应该是主程序,用于测试和展示二叉搜索树的功能。 在`BST.java`中,二叉搜索树的节点可能包含以下属性...

    数据结构 二叉排序树 java图形界面实现

    二叉排序树(Binary Sort Tree,也称为二叉搜索树),是数据结构中的一种特殊类型树,它具有以下特性:对于任意一个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。...

    java 实现二叉排序树 堆

    在Java中实现二叉排序树,我们需要定义一个Node类来表示树的节点,包含键值、左子节点和右子节点。然后创建一个BST类,包含插入、查找和删除等基本操作。以下是一个简单的Java实现: ```java public class Node { ...

    Java实现的二叉搜索树和平衡二叉树的代码示例

    在Java中实现二叉搜索树,通常会定义一个`Node`类来表示树的节点,包含键、值、左子节点和右子节点等属性。接着,可以创建一个`BinarySearchTree`类,其中包含插入、查找和删除等方法。以下是一个简单的二叉搜索树的...

    Binary_Search_Tree:用Java实现的二叉搜索树

    在Java中实现二叉搜索树,通常会定义一个名为`Node`的类来表示树的节点,包含键、值以及指向左右子节点的引用。接下来,我们创建一个名为`BinarySearchTree`的类,它包含了对树进行操作的主要方法,如插入、查找和...

    红黑树、二叉平衡树、二叉排序树的java实现

    其次,二叉平衡树(AVL树)是最早被提出的自平衡二叉搜索树,由G. M. Adelson-Velsky和E. M. Landis于1962年提出。AVL树要求每个节点的两个子树的高度差不超过1,以确保树的高度保持在log2(n+1)的范围内。为了维持这...

    简单二叉查找树的java实现

    二叉查找树的实现。包括树的平衡以及树节点的删除。以及树的广度优先遍历,深度优先遍历。

    二叉搜索树 转为 双向链表,

    二叉搜索树(Binary Search Tree, BST)是一种特殊的二叉树结构,其每个节点的值都大于左子树中所有节点的值,...这个转换过程对于理解和实现二叉搜索树到链表的转换具有重要意义,有助于提升对数据结构和算法的理解。

    二叉搜索树

    在JAVA中,构建二叉搜索树通常需要定义一个Node类来表示树的节点,节点通常包含一个键值(key)、一个指向左子节点的引用和一个指向右子节点的引用。例如: ```java public class Node { int key; Node left, ...

    算法笔记,将有序数组转为二叉搜索树

    本文将详细解释如何将有序数组转换为二叉搜索树,包括问题描述、解题思路、Java 和 Python 实现代码以及时间和空间复杂度分析。 问题描述 给定一个整数数组 nums,其中元素已经按升序进行了排序,请将其转换为一棵...

    二叉查找树实现源码(C、C++、JAVA)

    C、C++和Java实现二叉查找树时,通常会定义一个结构体(或类)来表示树节点,包括键值、指向左右子节点的指针以及可能的额外信息。对于C++和Java,还可以使用面向对象的方式,定义一个类来封装插入、查找和删除的...

    java--实现二叉排序树

    为了优化这种情况,可以使用自平衡二叉搜索树,如AVL树和红黑树,它们在任何情况下都能保证较好的性能。 以上就是关于Java实现二叉排序树的基本介绍,具体实现可以参考提供的`BinarySortTree.java`文件。在实际应用...

    tree-java.rar_tree_二叉搜索树

    在Java中实现二叉搜索树,我们需要定义一个`Node`类来表示树的节点,通常包括键、值、左子节点和右子节点。接着,我们需要一个`BinarySearchTree`类来操作这些节点,包含插入、查找、删除等基本操作。 例如,在`src...

    Java删除二叉搜索树最大元素和最小元素的方法详解

    在Java中,查询二叉搜索树的最大元素和最小元素可以通过递归的方式实现。下面是查询二叉搜索树的最小节点和最大节点的方法: 1.1 查询二分搜索树的最小节点 public E minimum() { if (size == 0) { throw new ...

Global site tag (gtag.js) - Google Analytics