二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作。

步骤就是原数据:数组

节点化数据:定义 Node节点对象

存储节点对象:通过LinkedList保存Node节点对象

在操作过程中我们需要将当前结点和前一节点、后一节点进行关系绑定

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 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节点

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);

}

}

java中怎样存储遍历的数据_【数据算法】Java实现二叉树存储以及遍历相关推荐

  1. java中的静态变量的作用域_详解JAVA中static的作用

    1.深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用:如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的:如果是说 可以构成 静态代码块,那别人认为你还可以: 如果你说 ...

  2. java中demo接人_return的用法_如何理解java中return的用法?

    C语言中return用法?(请熟练者进) return是返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么 比方主函数intmain() {}这里就必须有一个return,只 ...

  3. java中的强制类型转换注意事项_浅谈Java中强制类型转换的问题

    为了更好的理解我们先看下面的例子: package com.yonyou.test; import java.util.ArrayList; import java.util.Iterator; im ...

  4. Java中static的作用详解_详解java中static关键词的作用

    在java中,static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载 ...

  5. java中数学公式要引用什么包_五、java数学函数

    java.lang包中存放了大量数学函数,并且这些方法在类Math中是作为static方法出现的,所以引用一个特定的函数,只需将类Math和一个圆点写在要使用的方法前.如方法sqrt()是用来计算存储 ...

  6. java中bean的定义有哪些_详解Java的Spring框架中bean的定义以及生命周期

    bean的定义形成应用程序的骨干是由Spring IoC容器所管理的对象称为bean.bean被实例化,组装,并通过Spring IoC容器所管理的对象.这些bean由容器提供,例如,在XML的定义, ...

  7. JAVA中如何取map的值_如何在java中取map中的键值 的两种方法

    第一种方法根据键值的名字取值 import java.util.HashMap; import java.util.Map; public class Test { /** * @param args ...

  8. java中关于线程的状态属性_深入理解Java多线程与并发框(第①篇)——线程的状态...

    ![](http://img.blog.itpub.net/blog/2020/03/20/5d189a73e1147f37.png?x-oss-process=style/bb) **1. 新建状态 ...

  9. Java中如何实现添加用户信息_如何通过Java客户端在Active Directory中创建新用户并将其添加到现有组...

    我是初学者,我尝试用 Java实现Active Directory客户端.到目前为止,我编写了以下代码: import java.util.Hashtable; import javax.naming ...

  10. java中如何按名字来排序_如何在Java中对名称和年龄进行排序

    我是Java 8的新手,我只想按名称排序.但条件是:如果名称重复,则应根据年龄对其进行排序. 例如我的输入是 tarun 28 arun 29 varun 12 arun 22 并且输出应该是 aru ...

最新文章

  1. iOS SDWebImage加载webp
  2. 人人都能看懂的 6 种限流实现方案!(纯干货)
  3. 华为北大等打造的Transformer竟在CV上超过CNN
  4. MybatisPlus中插入数据获取主键值
  5. JZOJ 5474. 【NOIP2017提高组正式赛】时间复杂度
  6. [网络安全自学篇] 五十八.Windows安全缺陷利用之再看CVE-2019-0708及反弹shell防御措施
  7. MySQL之——GROUP BY分组取字段最大值
  8. 前端学习(3058):vue+element今日头条管理-回顾
  9. Cocos2d-x 3.2:定时器的使用和原理探究(2)
  10. Linux0.11 kernel/exit.c中的free_page_tables()
  11. 微软快捷键截图_如何在Microsoft Office的屏幕提示中显示快捷键
  12. 在Flask中上传本地图片到服务器
  13. 用matlab微分方程求解,用MATLAB求解微分方程
  14. 抖音壁纸表情包小程序搭建部署说明、广告分佣规则说明以及迭代新计划
  15. JavaScript 事件(冒泡捕获)处理模型
  16. 保姆级教程,如何发现 GitHub 上的优质项目?
  17. scrollbar滚动条修改样式
  18. asp毕业设计——基于asp+access的博客网站设计与实现(毕业论文+程序源码)——博客网站
  19. After Effects Premiere 教程收集
  20. 勿用Windows 8取代Windows XP的十大理由

热门文章

  1. memcached 系列2:memcached实例(转载)
  2. CCNP交换实验(3) -- STP
  3. CentOS下实现postgresql开机自启动
  4. 42佳优秀的 Photoshop 按钮制作教程
  5. mysql集群安装配置
  6. JSP/Servlet实验室设备管理系统文档
  7. hadoop集群的白名单和黑名单示例说明
  8. ATAC-seq【Harvard FAS Informatics】
  9. English trip -- Review Unit1 Personal Information 个人信息
  10. python学习笔记之socket(第七天)