`

java实现二叉树的构建以及3种遍历方法

阅读更多
大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿耿于怀,今天又遇见这个问题了,所以花了一下午的时间来编写代码以及介绍思路的文档生成!


目录:

1.把一个数组的值赋值给一颗二叉树

2.具体代码


1.树的构建方法



2.具体代码

package tree;

import java.util.LinkedList;
import java.util.List;

/**
 * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历
 * 
 * 参考资料0:数据结构(C语言版)严蔚敏
 * 
 * 参考资料1:http://zhidao.baidu.com/question/81938912.html
 * 
 * 参考资料2:http://cslibrary.stanford.edu/110/BinaryTrees.html#java
 * 
 * @author ocaicai@yeah.net @date: 2011-5-17
 * 
 */
public class BinTreeTraverse2 {

	private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	private static List<Node> nodeList = null;

	/**
	 * 内部类:节点
	 * 
	 * @author ocaicai@yeah.net @date: 2011-5-17
	 * 
	 */
	private static class Node {
		Node leftChild;
		Node rightChild;
		int data;

		Node(int newData) {
			leftChild = null;
			rightChild = null;
			data = newData;
		}
	}

	public void createBinTree() {
		nodeList = new LinkedList<Node>();
		// 将一个数组的值依次转换为Node节点
		for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
			nodeList.add(new Node(array[nodeIndex]));
		}
		// 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
		for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
			// 左孩子
			nodeList.get(parentIndex).leftChild = nodeList
					.get(parentIndex * 2 + 1);
			// 右孩子
			nodeList.get(parentIndex).rightChild = nodeList
					.get(parentIndex * 2 + 2);
		}
		// 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
		int lastParentIndex = array.length / 2 - 1;
		// 左孩子
		nodeList.get(lastParentIndex).leftChild = nodeList
				.get(lastParentIndex * 2 + 1);
		// 右孩子,如果数组的长度为奇数才建立右孩子
		if (array.length % 2 == 1) {
			nodeList.get(lastParentIndex).rightChild = nodeList
					.get(lastParentIndex * 2 + 2);
		}
	}

	/**
	 * 先序遍历
	 * 
	 * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
	 * 
	 * @param node
	 *            遍历的节点
	 */
	public static void preOrderTraverse(Node node) {
		if (node == null)
			return;
		System.out.print(node.data + " ");
		preOrderTraverse(node.leftChild);
		preOrderTraverse(node.rightChild);
	}

	/**
	 * 中序遍历
	 * 
	 * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
	 * 
	 * @param node
	 *            遍历的节点
	 */
	public static void inOrderTraverse(Node node) {
		if (node == null)
			return;
		inOrderTraverse(node.leftChild);
		System.out.print(node.data + " ");
		inOrderTraverse(node.rightChild);
	}

	/**
	 * 后序遍历
	 * 
	 * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
	 * 
	 * @param node
	 *            遍历的节点
	 */
	public static void postOrderTraverse(Node node) {
		if (node == null)
			return;
		postOrderTraverse(node.leftChild);
		postOrderTraverse(node.rightChild);
		System.out.print(node.data + " ");
	}

	public static void main(String[] args) {
		BinTreeTraverse2 binTree = new BinTreeTraverse2();
		binTree.createBinTree();
		// nodeList中第0个索引处的值即为根节点
		Node root = nodeList.get(0);

		System.out.println("先序遍历:");
		preOrderTraverse(root);
		System.out.println();

		System.out.println("中序遍历:");
		inOrderTraverse(root);
		System.out.println();

		System.out.println("后序遍历:");
		postOrderTraverse(root);
	}

}



输出结果:

先序遍历:
1 2 4 8 9 5 3 6 7 
中序遍历:
8 4 9 2 5 1 6 3 7 
后序遍历:
8 9 4 5 2 6 7 3 1 




.







分享到:
评论
6 楼 CmdSmith 2017-01-17  
这么构建出来的应该都是完全二叉树吧。。
5 楼 haoyuan2012 2016-07-10  
非常好,很受益
4 楼 haizhiguang 2016-03-06  
 


请问楼主是如何想到
nodeList.get(parentIndex).leftChild = nodeList.get(parentIndex * 2 + 1);
nodeList.get(parentIndex).rightChild = nodeList.get(parentIndex * 2 + 2);

*2+2  *2+1 这些内容是怎么想到的?可否交流下是如何思考的呢,谢谢!!!
3 楼 Angry_Icarus 2015-08-17  
   赞赞赞
2 楼 中国陆军 2014-05-27  
写得不错,用心了
1 楼 youyouyoushen 2013-11-20  
写的很好,楼主很用心

相关推荐

    java 完全二叉树的构建与四种遍历方法示例

    java 完全二叉树的构建与四种遍历方法示例 Java 完全二叉树的构建与四种遍历方法示例是 Java 编程语言中的一种重要数据结构。完全二叉树是一种特殊的二叉树,其中每个节点最多有两个孩子节点(左孩子和右孩子),...

    Java二叉树中序遍历

    中序遍历是二叉树遍历的一种方法,它按照“左-根-右”的顺序访问树中的所有节点,对于理解树的性质和执行某些操作非常有用。本课程设计将详细介绍如何使用Java编程语言实现二叉树的中序遍历。 首先,我们先构建...

    基于Java实现的二叉树的创建以及三种遍历.zip

    本资料包主要探讨了如何在Java中创建二叉树以及其三种基本遍历方法:前序遍历、中序遍历和后序遍历。首先,我们需要理解二叉树节点的定义,它通常包含一个数据字段和两个指向子节点的引用。 1. **二叉树节点定义**...

    根据二叉树前序遍历和中序遍历的结果输出后序遍历(java)

    在计算机科学中,二叉树是一种常见的数据结构,它的每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树的遍历是对其进行操作...在进行这类问题的解决时,理解和熟悉二叉树的性质以及各种遍历方法至关重要。

    JAVA实现二叉树建立、遍历

    在计算机科学中,二叉树是一种特殊的图结构,其中每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树广泛应用于数据存储、搜索算法、...了解这些基本概念和实现方法对于深入理解数据结构和算法至关重要。

    用Java实现二叉树的深度优先、广度优先遍历

    在计算机科学中,二叉树是一种...通过Java实现这些遍历方法,不仅能够加深对二叉树的理解,还能为解决实际问题提供基础。在实际开发中,如文件系统的目录遍历、图形界面的层次遍历等场景,都可能用到这些概念和技术。

    Java实现二叉树的层次遍历

    为了测试层次遍历,我们可以在`BinaryTree`类中添加一个构建二叉树的示例方法,并调用层次遍历方法: ```java public static void main(String[] args) { BinaryTree tree = new BinaryTree(); tree.root = new ...

    已知二叉树的前序和中序遍历,打印后序遍历

    在计算机科学中,二叉树是一种重要的数据结构,它的遍历是解决许多问题的基础。前序、中序和后序遍历是二叉树三种基本的遍历方式,每种方式都有其特定的访问顺序。这里我们将重点讨论如何在已知二叉树的前序和中序...

    java实现二叉树的创建和遍历

    本篇文章将详细探讨如何在Java中创建二叉树以及进行前、中、后序遍历。 首先,我们理解二叉树的基本概念。二叉树是一种特殊的树结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树可以用来表示...

    二叉树的遍历 java语言实现

    二叉树遍历是访问二叉树中所有节点的过程,通常有三种主要方法:前序遍历、中序遍历和后序遍历。这些遍历方式对于理解和操作二叉树数据结构至关重要。 1. **前序遍历**(Preorder Traversal): - 访问根节点。 -...

    用java实现二叉树的创建和遍历.doc

    在Java编程语言中,二叉树是一种非常重要的数据结构,它由节点组成,每个节点包含一个值和两个指向其他节点的引用,分别称为左子节点和右子节点。本篇将详细阐述如何使用Java实现二叉树的创建和遍历。 首先,我们...

    java实现二叉树最佳方法

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

    二叉树的遍历-java

    在Java中,实现这些遍历方法可以使用`Node`类来表示二叉树的节点,包含节点值、左子节点和右子节点。对于递归版本,可以直接在方法内实现;对于非递归版本,可以使用`java.util.Stack`来辅助实现。 例如,对于前序...

    建二叉树并分别用先先序、中序和后序遍历,然后输出各遍历序列

    为了实现这些功能,我们需要编写相应的函数,如`buildTree`用于构建二叉树,`preOrder`, `inOrder`, 和`postOrder`分别对应三种遍历方法,以及`swapChildren`用于交换节点的左右孩子。在实际编程中,我们还需要考虑...

    java实现二叉树的遍历

    本文介绍了二叉树的基本概念、性质以及Java语言实现的遍历方法。二叉树是一种非常重要的数据结构,在实际应用中有着广泛的应用场景,如搜索引擎的索引构建、编译器的语法分析等领域。理解并掌握二叉树的相关知识对于...

    Java实现二叉树的基本操作

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

    java实现 二叉树的创建,排序,遍历

    然后,**遍历二叉树**有三种常见方法:前序遍历、中序遍历和后序遍历。这些遍历方式有助于访问和操作二叉树的所有节点。 - **前序遍历**(根-&gt;左-&gt;右): ```java void preOrderTraversal(TreeNode node) { if ...

Global site tag (gtag.js) - Google Analytics