`

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

    代码实现: 二叉树的查找、插入、删除和输出根节点到当前节点的路径 二叉树的前序遍历,中序遍历和后续遍历 TreeNode.java --定义树节点 Mytree.java----创建树结构和上述功能函数 TestTree.java --测试上述的功能

    Java 构建与遍历树

    /** * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 * * 参考资料0:数据结构(C语言版)严蔚敏

    组合模式二叉树,前序、中序、后续,迭代器模式访问遍历

    使用composite模式构成二叉树,并用迭代器模式封装访问,前序、中序和后序的遍历。JAVA 编写。 Main中直接运行

    数据结构-二叉树(Java实现)

    编程实现如下功能: 1、假设二叉树的结点值是字符,根据输入的一颗二叉树的标明了空子树的完整先根遍历序列,建立一棵以二叉链表表示的二叉树。...3、统计二叉树的结点个数和叶子结点个数,并分别输出其值。

    java 二叉排序树构建遍历

    排序二叉树的基础代码,包含递归非递归二叉树构建、递归非递归遍历,获取最小最大值。

    完全二叉树的基本操作,二叉树的基本操作

    完全二叉树,二叉树的基本操作,遍历算法,构建等操作

    AIC的Java课程1-6章

     理解使用递归方法构建二叉排序树,前序、中序、后序遍历二叉树。  学习ArrayList与LinkedList类,理解封装数组和链表两种方式定义集合类。  可以使用迭代器Iterator遍历集合的元素。  [*]理解...

    JAVA面试题最全集

    请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来. 43.请写一个java程序实现线程连接池功能? 44.给定一个C语言函数,要求实现在java类中进行调用。 45.如何获得数组的长度? 46....

    BinaryTree:测试单词键上的二叉树查找性能

    搜索有序二叉树的预期结果为O(c log(n)),无序(遍历树的遍历)为O(c n)。 其中n是二叉树中的节点数(唯一项),而c是代表我计算机的强壮性的某个常数。 程序 用语料库中的术语子集(大小n)构建有序/无序...

    dsa-java:Java中的数据结构和算法

    主题涵盖诸如优先级队列,二叉树,尝试和图形之类的数据结构,以及它们在构建有效算法(如排序,搜索,平衡,遍历和生成)中的应用。 还讨论了网络流量和动态编程等高级主题。 在整个课程中,学生应该 对各种数据...

    datastructure:用java语言描述的数据结构

    datastructure 用java语言描述的数据结构 1.线性表 -&gt; ArrayList 2.链表 -&gt; LinkedList 双向链表 3.栈 (1)线性栈 (2)链栈 4.队列 (1)线性队列 (2)...5.二叉树 (1)二叉树的构建 (2)二叉树的遍历 (3)二叉树的特性算法

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    第3章 方法和作用域 43 3.1 创建方法 43 3.1.1 声明方法 43 3.1.2 从方法返回数据 44 3.1.3 调用方法 46 3.2 使用作用域 48 3.2.1 定义局部作用域 48 3.2.2 定义类的作用域 49 3.2.3 重载方法 50 3.3 编写...

    leetcode算法题主函数如何写-algorithm:关注算法,题目来源于LeetCode。使用Java8来实现,涵盖:数组、链表、栈、堆、

    方法:每次获取剩余整数的个位数,可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。 8. 请你来实现一个 atoi 函数,使其能将字符串转换成整数。

    Leetcode扑克-jianzhi-offer:剑指offer-Java题解

    [用前序和中序遍历序列构建二叉树] - leetcode 105 用两个栈实现队列 - [使用栈实现队列] - leetcode 232 旋转数组的最小数字 - [旋转有序数组的最小值] - leetcode 153 斐波那契数列 - [第 n 个斐波那契数] - ...

    java8源码-interview:面试

    java8 源码 Table of Contents * * 重点 * Created by 数据结构 数组和String 数组a,先单调地址再单调递减,输出数组中不同元素个数。要求:O(1)空间复杂度,不能改变原数组 看 链表 基础 头插法 尾插法 双向链表 ...

    leetcode2-Data-Structures-and-Algorithms:流行的数据结构和算法问题的解决方案

    二叉树遍历 二叉树视图 二叉搜索树 特里 图表 图遍历 最短路径 贝尔曼-福特 弗洛伊德-沃歇尔 约翰逊算法 最小生成树 Prim 算法 Tarjan 算法 检测周期 连接组件 强连接组件 堆 Paradigm 的算法: 分而治之 将问题分成...

    cpp-算法精粹

    二叉树的遍历 Binary Tree Preorder Traversal Binary Tree Inorder Traversal Binary Tree Postorder Traversal Binary Tree Level Order Traversal Binary Tree Level Order Traversal II Binary Tree Right Side ...

    leetcode338-may_leetcoding_challenge:MayLeetcodingChallenge的Java解决方案存储库

    第 338 章五月 Leetcoding 挑战 ...从前序遍历构建二叉搜索树 - 问题 :right_arrow: 未交叉线 - 问题 :right_arrow: 连续数组 - 问题 :right_arrow: 可能的二分法 - 问题 :right_arrow: 计数位 - 问题

Global site tag (gtag.js) - Google Analytics