`
若是人间
  • 浏览: 76289 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 二叉树的实现

阅读更多

BinaryTree类:

package com.javaeye.rsrt;

/**
 * 
 * @author nishiting
 *
 */

public class BinaryTree {

	private Node root;
	
	/**
	 * 内部类实现结点类,可提高安全性
	 * @author nishiting
	 *
	 */

	private static class Node {
		Node left;
		Node right;
		int data;

		Node(int newData) {
			left = null;
			right = null;
			data = newData;
		}

	}

	/**
	 * 创建一个空的二叉树
	 */

	public BinaryTree() {
		root = null;
	}
	
	/**
	 * 递归的插入数值
	 * @param data	要插入的数值
	 */

	public void insert(int data) {
		root = insert(root, data);
	}
	
	/**
	 * 将数值插入到二叉树中,比当前结点小或等于当前结点的插在当前结点的左侧,比当前结点大的数插在当前结点的右侧,每次从根结点开始递归比较
	 * @param node	当前的结点,就是根结点,只是每次根结点的左右子孙更新
	 * @param data	要插入的数值
	 * @return	新排好的二叉树
	 */

	private Node insert(Node node, int data) {

		if (node == null) {

			node = new Node(data);

		} else {
			if (data <= node.data) {
				node.left = insert(node.left, data);
			} else {
				node.right = insert(node.right, data);
			}
		}
		return (node);
	}
	
	/**
	 * 将数值输入构建二叉树
	 * @param data	要输入的数值
	 */

	public void buildTree(int[] data) {

		for (int i = 0; i < data.length; i++) {

			insert(data[i]);

		}

	}
	
	/**
	 * 递归打印出二叉树
	 */

	public void printTree() {

		printTree(root);

		System.out.println();

	}
	
	/**
	 * 从根结点开始遍历,从树的最高层叶子结点开始输出,从左至右
	 * @param node	当前的结点
	 */

	private void printTree(Node node) {

		if (node == null)
			return;

		// left, node itself, right

		printTree(node.left);

		System.out.print(node.data + "  ");

		printTree(node.right);

	}

}

 测试类:

package com.javaeye.rsrt;

import junit.framework.TestCase;

public class BinaryTreeTest extends TestCase {

	public void testBinaryTreeTest() {

		BinaryTree biTree = new BinaryTree();

		int[] data = { 2, 8, 7, 4 ,9,3,1,6,7,5};

		biTree.buildTree(data);

		biTree.printTree();

	}

}
 
13
2
分享到:
评论
7 楼 皓子罗 2012-11-22  
遍历顺序错了,应该是
    if(node==null){
    return;
    }
    else {
    System.out.println(node.data+" ");
    printTree(node.left);
    printTree(node.right);
    }
6 楼 TheMatrix 2012-09-24  
现在是int,如果是字符呢,比如:Comparable[] strArr2 = { "c", "b", "x", "a", "k" };

以下是另外一种写法,请指教:

class TreeNode {
	@SuppressWarnings("rawtypes")
	public Comparable nodeData;
	public TreeNode left;
	public TreeNode right;

	public TreeNode(Comparable<?> nodeData) {
		this.nodeData = nodeData;
	}

	@SuppressWarnings("unchecked")
	public void addNode(TreeNode newNode) {
		if (this.nodeData.compareTo(newNode.nodeData) >= 0) {
			if (this.left == null) {
				this.left = newNode;
			} else {
				this.left.addNode(newNode);
			}
		} else {
			if (this.right == null) {
				this.right = newNode;
			} else {
				this.right.addNode(newNode);
			}
		}
	}

	public void printNode() {
		// 1����ʾ��ڵ�
		if (this.left != null) {
			this.left.printNode();
		}
		// 2����ʾ�м�ڵ�
		System.out.println(this.nodeData);
		// 3����ʾ�ҽڵ�
		if (this.right != null) {
			this.right.printNode();
		}
	}
}

class BinaryTreeCtrl {
	private TreeNode root = null;

	private void buildBinaryTree(Comparable<?>[] args) {
		for (Comparable<?> i : args) {
			if (root == null) {
				root = new TreeNode(i);
			} else {
				root.addNode(new TreeNode(i));
			}

		}

	}

	public BinaryTreeCtrl(Comparable<?> args[]) {
		buildBinaryTree(args);
	}

	public void printSortedList() {
		this.root.printNode();
	}

}

public class BinaryTree {

	public BinaryTree() {

	}

	@SuppressWarnings("rawtypes")
	public static void main(String[] args) {
		Comparable[] intArr1 = { 3, 5, 66, 7, 2, 33, 6, 46, 17 };
		new BinaryTreeCtrl(intArr1).printSortedList();
		
		Comparable[] strArr2 = { "c", "b", "x", "a", "k" };
		new BinaryTreeCtrl(strArr2).printSortedList();		
	}

}
5 楼 hanazawakana 2012-06-27  
马克下,学习之
4 楼 knowledge360 2012-05-27  
3 楼 bo_hai 2011-01-17  
写的很好,我学习了。
2 楼 hlzhou 2010-12-23  
1 楼 biguan 2010-07-21  
感谢你让我明白了二叉树的规则,同时发现对二叉树的抽象对象还可以改进一下,特把代码发上来,以供交流。
/**
 * 写一个二叉树
 * */
public class MyBinaryTree {
	private MyNode root;//根节点
	private MyBinaryTree left;//左子树
	private MyBinaryTree right;//右子树
	
	/**
	 * 添加一个数
	 * 将数值插入到二叉树中,比当前结点小或等于当前结点的插在当前结点的左侧,比当前结点大的数插在当前结点的右侧,每次从根结点开始递归比较
	 * */
	public void addData(int n){
		if(root==null){
			root = new MyNode();
			root.setData(n);
		}else{
			int data = root.getData();
			if(n<=data){
				if(this.left==null)
					this.left = new MyBinaryTree();
				this.left.addData(n);
			}else{
				if(this.right==null)
					this.right = new MyBinaryTree();
				this.right.addData(n);
			}
		}
	}
	/**
	 * 先序排序
	 * */
	public void preorder(){
		if(this.root!=null)
			System.out.print(root.getData()+",");
		if(this.left!=null)
			this.left.preorder();
		if(this.right!=null)
			this.right.preorder();
	}
	/**
	 * 中序排序
	 * */
	public void inorder(){
		if(this.left!=null)
			this.left.inorder();
		if(this.root!=null)
			System.out.print(root.getData()+",");
		if(this.right!=null)
			this.right.inorder();
	}
	/**
	 * 后序排序
	 * */
	public void postorder(){
		if(this.left!=null)
			this.left.postorder();
		if(this.right!=null)
			this.right.postorder();
		if(this.root!=null)
			System.out.print(root.getData()+",");
	}

	
	public static void main(String[] args) {
		int[] arr = {2, 8, 7, 4 ,9,3,1,6,7,5};
		MyBinaryTree bt = new MyBinaryTree();
		for(int i=0;i<arr.length;i++){
			bt.addData(arr[i]);
		}
		System.out.println("先序:");
		bt.preorder();
		System.out.println("\n中序:");
		bt.inorder();
		System.out.println("\n后序:");
		bt.postorder();
	}

}
/**
 * 节点对象
 * */
class MyNode {
	private int data;//存储的数据

	public int getData() {
		return data;
	}

	public void setData(int data) {
		this.data = data;
	}
	
}

相关推荐

    java 二叉树实现

    java二叉树实现 (简单实现,入门用) /**创建二叉树*/ public BinaryTree createTree(String treeStr); /**寻找结点*/ public BinaryTree findNode(BinaryTree tree ,char sign); /**找所给结点的左子树*/ ...

    二叉树的java实现

    二叉树的java实现

    利用二叉树实现多项式计算

    标题“利用二叉树实现多项式计算”明确指出本文将探讨如何通过构建二叉树来实现对多项式的运算处理。 #### 描述解读: 描述部分提到该资源为txt文本,内容包括实现思路与具体代码实现,仅供学习参考使用,不得用于...

    二叉树可视化Java语言实现(完整版,打开即可运行)

    在这个Java实现中,我们可以看到一个完整的二叉树可视化系统,包括四个关键的Java源文件:BinaryNode、Show1_12、Display_Tree和TreeControl。 1. **BinaryNode.java**: 这个文件代表二叉树的基本节点。在Java中,...

    java 二叉树新增删除

    在本话题中,我们将深入探讨Java中二叉树的插入、删除操作以及遍历方法。 1. **二叉树的基本概念**: - **根节点**:二叉树中的顶级节点,没有父节点。 - **子节点**:由一个节点指向另一个节点的连接,指向的...

    java二叉树算法(转)

    这篇博客"java二叉树算法(转)"可能会探讨如何在Java中实现和操作二叉树,特别是涉及算法的部分。二叉树通常用于搜索、排序和组织数据,其特性是每个节点最多有两个子节点,通常分为左子节点和右子节点。 二叉树的...

    Java实现二叉树的遍历

    java实现二叉树非递归前序中序后序遍历

    java二叉树

    以下是对"java二叉树"这个主题的详细解析。 首先,我们要理解二叉树的基本操作: 1. 插入节点:在二叉树中插入新节点时,需要遵循二叉树的规则,即新节点只能作为现有节点的左孩子或右孩子。插入操作取决于比较新...

    java简单实现二叉树

    ### Java简单实现二叉树知识点解析 #### 一、二叉树基本概念 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树在计算机科学中有着广泛的应用,如搜索算法、排序算法...

    Java二叉树中序遍历

    本课程设计将详细介绍如何使用Java编程语言实现二叉树的中序遍历。 首先,我们先构建二叉树的节点类(Node),它包含一个数据字段(data)以及指向左子节点(left)和右子节点(right)的引用: ```java public ...

    java二叉树的实现

    用java写的二叉树,一种特别的二叉树,右子树大于左子树,具体的名称不记得了。

    java实现的二叉树源码

    下面我们将详细讨论在给定的“java实现的二叉树源码”中涉及的知识点。 1. **节点(Node)**: 节点是二叉树的基本构建单元,通常包含两个子节点(左子节点和右子节点)以及一个存储数据的属性。在`Node.java`文件中,...

    java实现二叉树最佳方法

    在Java中实现二叉树的最佳方法涉及对其逻辑结构和存储结构的理解,以及如何通过代码高效地构建和遍历二叉树。 首先,数据结构可以按逻辑结构分类,其中二叉树属于非线性结构。二叉树的逻辑分类是基于节点与子树之间...

    java二叉树的前序+中序+后序遍历

    java实现 二叉树的遍历 前序遍历用到递归, 中序和后序遍历用到栈, 其实还是有一定难度的

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

    本文将深入探讨“数据结构 二叉树 java图形界面实现”这一主题,主要围绕二叉树的基本概念、常见操作以及如何在Java环境中结合图形界面进行实现。 首先,二叉树是一种非线性的数据结构,每个节点最多有两个子节点,...

    Java二叉树算法实例.zip_java 二叉树_二叉树

    这个名为"Java二叉树算法实例.zip"的压缩包显然是一个针对初学者的教程,旨在帮助他们理解并掌握二叉树的基本概念和常见算法。 首先,二叉树是由节点构成的数据结构,每个节点包含两个子节点,分别称为左子节点和右...

    java实现二叉树程序

    java用队列实现的二叉树程序//入队 public void enqueue(E e); //出队 public E dequeue(); //取队列第一个 public E front(); //队列是否为空 public boolean isEmpty(); //队列大小 public int size...

    Java 二叉树(生成与遍历)

    本项目提供了Java实现二叉树的相关代码,帮助你理解和操作这种数据结构。 首先,我们要了解二叉树的基本概念。二叉树可以分为几种类型:满二叉树(每个节点要么没有子节点,要么有左右两个子节点)、完全二叉树...

    java使用jtree动态实现二叉树

    在Java中动态实现二叉树,即在运行时根据需要创建、更新和操作树结构,这涉及到对数据结构和Swing组件的深入理解。 首先,二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,分别称为左孩子和右孩子。...

    Java实现二叉树的基本操作

    在Java中实现二叉树的基本操作是编程学习中的一个重要环节,这包括创建、插入节点、删除节点、遍历以及查找等操作。下面将详细介绍这些知识点。 1. **创建二叉树** 创建二叉树首先需要定义一个二叉树节点类,包含...

Global site tag (gtag.js) - Google Analytics