`
bo_hai
  • 浏览: 564717 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

二叉排序树使用List 实现(JAVA)

阅读更多

使用JAVA中的List构建二叉排序树。其中,iterator方法不知道怎么样写,请大伙支援?代码如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class BinaryTreeList<E> extends AbstractSingleLinkedList<E> implements List<E> ,java.io.Serializable {

	private static final long serialVersionUID = -5672690815694732101L;
	private Entry<E>	root;
	private int size ;
	public BinaryTreeList() {
		this.root = null;
	}
	
	public boolean add(E e) {
		Entry<E> newEntry = new Entry<E>(e,null,null);
		if (this.root == null) {
			this.root = newEntry;
		} else {
			Comparable<? super E> k = (Comparable<? super E>) e;
			Entry<E> currentEntry = this.root;
			Entry<E> parentEntry = null;
			int result = 0;
			while (currentEntry != null) {
				result = k.compareTo(currentEntry.data);
				parentEntry = currentEntry;
				if (result > 0) {
					currentEntry = currentEntry.rigthChild;
				} else {
					currentEntry = currentEntry.leftChild;
				}
			}
			if (result > 0) {
				parentEntry.rigthChild = newEntry;
			} else {
				parentEntry.leftChild = newEntry;
			}
			
		}
		size ++;
		return true;
	}
	
	public Entry<E> getRoot() {
		return this.root;
	}
	
	/**
	 * 使用递归遍历tree
	 * @param tree
	 * @param result
	 * @return
	 */
	private void preOrder(Entry<E> tree,List<E> result) {
		if (tree != null) {
			preOrder(tree.leftChild,result);
			result.add(tree.data);
			preOrder(tree.rigthChild,result);
		}
	}
	
	public List<E> showTree() {
		List<E> result = new ArrayList<E>(size);
		preOrder(getRoot(),result);
		return result;
	}
	
	@Override
	public Iterator<E> singleListIterator() {
		/**
		 * 这个地方怎么样实现呢 ?
		 * 就是怎么样把递归写成循环?
		 */
		return new Iterator<E>() {
			private Entry<E> current = root;
			@Override
			public boolean hasNext() {
				return false;
			}

			@Override
			public E next() {
				return null;
			}

			@Override
			public void remove() {
				throw new UnsupportedOperationException("can not remove");
			}
			
		};
	}

	@Override
	public E get(int index) {
		throw new UnsupportedOperationException("can not get");
	}

	@Override
	public int size() {
		return size;
	}

	public static class Entry<E>{
		E data;
		Entry<E> leftChild;
		Entry<E> rigthChild;
		
		public Entry(E e,Entry<E> leftChild,Entry<E> rigthChild) {
			this.data = e;
			this.leftChild = leftChild;
			this.rigthChild = rigthChild;
		}
	}
}

 测试类如下:

import junit.framework.TestCase;

import org.junit.Test;


public class BinaryTreeListTest extends TestCase {

	@Test
	public void testAdd() {
		BinaryTreeList<Integer> list = new BinaryTreeList<Integer>();
		list.add(381);
		list.add(12);
		list.add(410);
		list.add(9);
		list.add(40);
		list.add(394);
		list.add(540);
		list.add(35);
		list.add(190);
		list.add(476);
		list.add(760);
		list.add(146);
		list.add(445);
		list.add(600);
		list.add(800);
		//preOrder(list.getRoot());
		for (Integer val : list.showTree()) {
			System.out.print(val);
			System.out.print('\t');
		}
	}
	/*
	public static void preOrder(BinaryTreeList.Entry<Integer> tree) {
		if (tree != null) {
			preOrder(tree.leftChild);
			System.out.print(tree.data);
			System.out.print('\t');
			preOrder(tree.rigthChild);
		}
	}
	*/
}

 输出结果:

9	12	35	40	146	190	381	394	410	445	476	540	600	760	800	

 不足之处:BinaryTreeList 的对象不能使用foreach遍历出结果,必须先调用 list.showTree() 生成一个arrayList。求教:iterator怎么实现呢?

分享到:
评论

相关推荐

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

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

    25.二叉查找树.wmv(目前数据结构最好的视频,共42集,需要哪一集的知识自己下,一集3积分)

    17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27红黑树_0 28红黑树_1 29红黑树_2 30红黑树_3 31红黑树_4 32红黑树_5 33红黑树_6 34堆 35堆排序 36...

    35.堆排序.wmv(目前数据结构最好的视频,共42集,需要哪一集的知识自己下,一集3积分)

    17循环链表 18双项链表 19链式栈 20链式队列 21STL_list类 22基数排序 23属 24二叉树 25二叉树找数 26红黑树 27红黑树_0 28红黑树_1 29红黑树_2 30红黑树_3 31红黑树_4 32红黑树_5 33红黑树_6 34堆 35堆排序 36...

    Java集合排序及java集合类详解(Collection、List、Map、Set)

    - **TreeMap**:通过红黑树实现,红黑树是一种自平衡的二叉查找树。 #### Set `Set`接口继承自`Collection`接口,不允许有重复元素。 ##### 概述 `Set`的主要实现包括`HashSet`、`LinkedHashSet`、`TreeSet`等。...

    Java实现排序的12种方式(3).zip_java排序(3)_八叉树

    本资料主要探讨了Java中实现排序的12种方法,其中包括一些经典的排序算法以及基于集合的排序方式。以下是对这些排序算法的详细介绍: 1. **计数排序**:计数排序是一种非比较型排序算法,适用于整数排序。它通过...

    Java集合排序及java集合类详解(Collection、List、Map、Set).pdf

    Java集合排序及Java集合类详解 Java集合框架是Java语言中最重要、最常用的部分之一,它能够使开发者更方便地处理数据结构。Java集合框架主要包括Collection、List、Set、Map四个接口,它们分别实现了不同的数据结构...

    DSAA_堆排序java实现_源码

    标题中的“DSAA_堆排序java实现_源码”表明这是一个关于数据结构与算法分析(Data Structures and Algorithms Analysis,简称DSAA)的资料包,主要关注堆排序算法的Java实现。堆排序是一种高效的排序算法,它利用了...

    数据结构常考知识点(java实现版)

    Java中,TreeSet和TreeMap实现了红黑树,而PriorityQueue内部使用了堆数据结构。 3. 图: 图是由节点(顶点)和连接节点的边构成,可以表示复杂的关系。图分为有向图和无向图,Java中没有直接提供图的实现,但可以...

    二叉树的基本操作(java实现)

    - 使用Java集合框架中的数据结构(如List、Set)可能会在某些操作中提供便利。 - Java的异常处理机制保证了程序在遇到错误时的健壮性。 6. **应用领域**: - 二叉树在计算机科学中有广泛应用,如文件系统、...

    java实现的数据结构与算法

    第八章讲述了查找的基本概念和实现,包括顺序查找、折半查找、查找树(二叉查找树、AVL树、B-树)以及哈希技术(哈希表、哈希函数、冲突解决)。这些内容对于实现高效的查找操作至关重要。 第九章则讨论了排序问题...

    数据结构Java版本.pdf

    根据提供的文件标题“数据结构Java版本.pdf”及描述“适合热爱学习Java的,用于帮助复习文档”,我们可以推测这份文档主要涵盖了使用Java语言实现的各种数据结构的相关知识与实践内容。下面将详细阐述可能涉及的一些...

    java实现常用算法

    在Java中,我们可以使用`PriorityQueue`类来实现堆排序,或者自定义堆结构进行排序。 - **红黑树**:红黑树是一种自平衡的二叉查找树,它的插入、删除和查找操作的时间复杂度都是O(logn)。Java中的`java.util....

    java数据结构算法实现

    除此之外,Java数据结构还包括链表、栈、队列、树(如二叉搜索树、AVL树、红黑树等)、图、哈希表等。每种数据结构都有其特定的应用场景和优缺点,选择合适的数据结构能显著提高程序的性能。 在实际编程中,理解并...

    对一致性Hash算法,Java代码实现的深入研究1

    1. **排序+List**:首先,将所有服务器节点的哈希值放入一个数组,然后使用排序算法(如归并排序、快速排序等)对数组进行排序,再将排序后的结果放入List中。之后,针对新的请求,可以在List中找到第一个大于请求...

    JAVA数据结构实验报告

    Java的LinkedList实现了List接口,支持双向遍历。 3. ArrayList和Vector:都是基于动态数组实现的列表,ArrayList提供了更快的随机访问速度,而Vector是线程安全的。 4. LinkedList:适用于频繁插入和删除操作,因为...

    java中list、set和map 的区别

    - **TreeSet**: 这种实现通过红黑树(一种自平衡二叉搜索树)来存储元素,可以自然地对元素进行排序。`TreeSet`保证了集合中元素的有序性,并且提供了`subSet`等方法来获取子集。 - **LinkedHashSet**: 这种实现...

    数据结构与算法(Java语言版) 周鹏 三峡大学理学院

    第九章对排序算法进行了讲解,涵盖了排序的基本概念、插入类排序(直接插入排序、折半插入排序和希尔排序)以及查找树排序(如二叉查找树排序和AVL树排序)。 该书整体上采用Java语言描述数据结构与算法的实现,将...

    java 集合(list-queue-set)学习

    TreeSet实现了SortedSet接口,它使用红黑树进行数据存储,元素默认按照自然排序或自定义比较器进行排序。 Queue是Java集合框架中的队列接口,用于处理先进先出(FIFO)的数据结构。LinkedList除了实现List接口外,...

    java内功必须课程

    此外,Java集合框架(Collections Framework)提供了丰富的接口和类,如List、Set、Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类,它们都基于不同的数据结构。熟悉这些接口和类的使用,能够帮助...

    18年秋招JAVA面经精心整理总结

    Java面试经验整理涉及了Java集合框架的核心知识点,特别是List、Set和Map三个接口及其子接口和实现类的特性、用途和性能比较。以下是对这部分内容的知识点总结: 1. Java集合框架结构 Java集合框架由Collection...

Global site tag (gtag.js) - Google Analytics