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

Java版的树

    博客分类:
  • Java
阅读更多

用java实现的树,

先定义一个树的接口,暂时只有两个基本方法,

package com.woxiaoe.collection.tree;

/**
 * 书接口
 * @author 小e
 *
 * 2010-4-8 下午08:04:09
 */
public interface Tree<T> extends Iterable<T>  {
	
	/**
	 * 深度
	 * @return
	 */
	public int depth();
	
	/**
	 * 叶子节点数
	 * @return
	 */
	public int leafCount();

}

 接着定义一个树节点针对二叉树

package com.woxiaoe.collection.tree;
/**
 * 树节点
 * @author 小e
 *
 * 2010-4-8 下午08:06:04
 */
public class Tnode<T>{
	
	private Tnode<T> left;
	private Tnode<T> right;
	private T value;
	
	public Tnode(T value) {
		this.value = value;
	}
	public Tnode(T value, Tnode<T> left, Tnode<T> right){
		this.value = value;
		this.left = left;
		this.right = right;
	}
	
	public Tnode<T> getLeft() {
		return left;
	}
	public void setLeft(Tnode<T> left) {
		this.left = left;
	}
	public Tnode<T> getRight() {
		return right;
	}
	public void setRight(Tnode<T> right) {
		this.right = right;
	}
	public T getValue() {
		return value;
	}
	public void setValue(T value) {
		this.value = value;
	}
}
 

二叉树

package com.woxiaoe.collection.tree;

import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Stack;

/**
 * 二叉树
 * @author 小e
 *
 * 2010-4-8 下午08:04:53
 */
public class BinaryTree<T> implements Tree<T> {
	private Tnode<T> root;//根结点
	
	public BinaryTree() {
		root = null;
	}
	
	public BinaryTree(Tnode<T> root){
		this.root = root;
	}
	public Tnode<T> getRoot() {
		return root;
	}

	public void setRoot(Tnode<T> root) {
		this.root = root;
	}

	@Override
	public int depth() {
		return depth(root);
	}

	@Override
	public int leafCount() {
		return leafCount(root);
	}
	private int depth(Tnode<T> node) {
		if(node == null){
			return -1;
		}
		int leftHeight = depth(node.getLeft());
		int rightHeight = depth(node.getRight());
		return 1 + (leftHeight > rightHeight?leftHeight:rightHeight);
	}
	private int leafCount(Tnode<T> node){
		if(node.getLeft() == null && node.getLeft() == null){
			return 1;
		}
		return leafCount(node.getLeft()) + leafCount(node.getRight());
		
	}

	@Override
	public Iterator<T> iterator() {
		return new InorderIterator();
	}
	
	private class InorderIterator implements Iterator<T>{
		private Stack<Tnode<T>> s ;
		Tnode<T> curr;
		public InorderIterator() {
			s = new Stack<Tnode<T>>();
			curr = getFarLeft(root);
		}
		@Override
		public boolean hasNext() {
			return curr != null;
		}

		@Override
		public T next() {
			if(curr == null){
				throw new NoSuchElementException("没有节点");
			}
			T value = curr.getValue();
			if(curr.getRight() != null){
				curr = getFarLeft(curr.getRight());
			}else if(!s.isEmpty()){
				curr = s.pop();
			}else{
				curr = null;
			}
			
			return value;
		}

		@Override
		public void remove() {
			throw new RuntimeException("不支持该方法");
		}
		/**
		 * 得到右子树最远的有节点
		 * @return
		 */
		private Tnode<T> getFarLeft(Tnode<T> node){
			if(node == null){
				return null;
			}
			
			while(node.getLeft() != null){
				s.push(node);
				node = node.getLeft();
			}
			
			return node;
		}
		
	}
}

 

以下为测试代码

package com.woxiaoe.collection.tree;

import java.util.Iterator;

import junit.framework.TestCase;

public class TreeTest extends TestCase {
	BinaryTree tree = new BinaryTree();
	@Override
	protected void setUp() throws Exception {
		Tnode<String> root = new Tnode<String>("root");
		Tnode<String> a = new Tnode<String>("a");
		Tnode<String> b = new Tnode<String>("b");
		Tnode<String> c = new Tnode<String>("c");
		Tnode<String> d = new Tnode<String>("d");
		
		a.setLeft(b);
		a.setRight(c);
		
		root.setLeft(a);
		root.setRight(d);
		
		tree.setRoot(root);
	}
	public void testTree(){
		
		
		System.out.println("tree height:" + tree.depth());
		System.out.println("leaf node:" + tree.leafCount());
		
		System.out.println("先序排列");
		NLR(tree.getRoot());
		
		System.out.println("中序排列");
		LNR(tree.getRoot());
		
		System.out.println("后序排列");
		LRN(tree.getRoot());

		System.out.println("测试遍历");
		
		for (Iterator iterator = tree.iterator(); iterator.hasNext();) {
			String nodeValue = (String) iterator.next();
			System.out.print(nodeValue + " ");
		}
		
	}
	/**
	 * 先序排列
	 * @param node
	 */
	public void NLR(Tnode node){
		if(node == null){
			return;
		}
		visit(node);
		NLR(node.getLeft());
		NLR(node.getRight());
	}
	/**
	 * 中序排列
	 * @param node
	 */
	public void LNR(Tnode node){
		if(node == null){
			return;
		}
		LNR(node.getLeft());
		visit(node);
		LNR(node.getRight());
	}
	/**
	 * 后序排列
	 * @param node
	 */
	public void LRN(Tnode node){
		if(node == null){
			return;
		}
		LRN(node.getLeft());
		LRN(node.getRight());
		visit(node);
	}
	public void visit(Tnode node){
		System.out.println(node.getValue());
	}
	@SuppressWarnings("unchecked")
	public void testIterator(){
		for (Iterator iterator = tree.iterator(); iterator.hasNext();) {
			String str = (String) iterator.next();
			System.out.print(str + " ");
		}
	}
}

 Output

tree height:2

leaf node:3

先序排列

root

a

b

c

d

中序排列

b

a

c

root

d

后序排列

b

c

a

d

root

测试遍历

b a c root d b a c root d 

1
0
分享到:
评论
1 楼 chxiaowu 2013-03-19  
不错!

相关推荐

    Java目录树控件

    在Java编程中,构建一个能够展示系统目录树结构的控件是常见的需求,尤其是在开发桌面应用或者需要用户浏览文件系统时。"Java目录树控件"的实现涉及到多个技术点,包括文件I/O操作、数据结构和图形用户界面(GUI)...

    Javatree java树结构

    Java树结构是计算机科学中的一种数据结构,它模拟了自然界中的树形态,通过节点和边来组织数据。在Java编程中,树结构被广泛应用于数据的组织和操作,如文件系统、编译器语法分析、搜索算法等。下面将详细阐述Java树...

    java 菜单树的实现

    Java 菜单树的实现,可以很方便的移植到其他程序,方便使用,而且具有代表性.

    java多叉树的实现和遍历输出

    在Java编程中,多叉树是一种非线性数据结构,每个节点可以有多个子节点,与二叉树(每个节点最多有两个子节点)相比,它提供了更广泛的灵活性。本篇文章将深入探讨如何在Java中实现多叉树以及其遍历方法。 首先,...

    java动态树形菜单

    在Java Web开发中,动态树形菜单是一种常见的用户界面元素,尤其在管理系统的导航部分,它能够以层次结构展示数据,使用户能直观地浏览和操作复杂的数据结构。本示例是一个基于Java实现的JSP动态树形菜单功能,旨在...

    java树形菜单

    在Java编程中,树形菜单是一种常见的用户界面元素,它以层次结构展示数据,通常用于文件系统、组织架构或程序功能导航。这个压缩包“treemenu”很可能包含了一个简单的WinFrom应用程序,其中实现了树形菜单的功能。...

    java版数据结构-树结构

    java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;java版数据结构-树结构;

    java复制树结构数据方法

    自己写的一个 用java代码复制树形结构数据的方法 很实用 希望对有需求的朋友给予帮助

    java动态树形菜单与分页

    在Java开发中,动态树形菜单和分页是常见的需求,尤其在构建Web应用程序时,它们对于用户界面的交互性和数据管理的效率至关重要。本文将深入探讨这两个概念以及如何在Java环境中实现它们。 首先,我们来看动态树形...

    树形结构设计总结java demo

    本篇文章将深入探讨“树形结构设计”在Java环境下的实现,并结合给出的链接资源——一篇在CSDN博客上的文章(虽然无法直接访问,但我们可以根据描述推测其内容),以及名为“tms”的压缩包文件,来解析相关知识点。...

    用JAVA显示树形目录

    用JAVa实现 树形目录的显示,有界面

    Java 动态树 dhtmlxtree

    Java 动态树dhtmlxtree是一个用于在Java应用程序中创建交互式树形视图的组件,它基于JavaScript库dhtmlxSuite。dhtmlxtree是用于构建富客户端Web应用的工具,它允许开发者在网页上展示数据结构,提供可折叠、可扩展...

    圣诞树源码-Java圣诞树程序源码下载

    Java圣诞树程序是一种趣味性的编程练习,它利用控制台输出创建出类似圣诞树的图形。在给定的压缩包中,包含三个不同设计的Java源码文件:`ChristmasTreePattern1.java`, `ChristmasTreePattern2.java`, 和 `...

    java后缀树代码

    本文将详细解析"java后缀树代码"这个主题,结合提供的文件列表,我们将会深入理解后缀树的实现原理,并探讨如何在Java中构建这种数据结构。 后缀树的核心在于它可以存储一个字符串的所有后缀,并且每个后缀只用一条...

    基于JAVA建立树形结构的算法优化.pdf

    从普通Java对象中建立树形结构的过程涉及到算法设计与优化。原始数据通常是扁平化存储的,需要通过特定的算法将其转换为具有层次结构的树形数据。在教师信息系统的基本信息模块中,地址信息的管理是构建树形结构的一...

    java树节点逐级汇总.zip

    "java树节点逐级汇总.zip"这个压缩包提供的内容,旨在帮助开发者处理无序列表数据,并将其转化为可以逐级汇总的树形结构。下面将详细介绍这个过程中的关键知识点。 1. **树形结构**: - 树形结构是一种非线性的...

    java 决策树Demo2

    在Java中实现决策树可以帮助开发者构建预测模型,解决复杂的问题。本教程将详细讲解如何使用Java进行决策树的实现,以及“Demo2”可能涉及的具体内容。 1. **决策树的基本概念** - **决策树结构**:决策树由节点...

Global site tag (gtag.js) - Google Analytics