转载自http://ocaicai.iteye.com/blog/1047397

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

目录:

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

2.具体代码

1.树的构建方法

2.具体代码

  1. package tree;
  2. import java.util.LinkedList;
  3. import java.util.List;
  4. /**
  5. * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历
  6. *
  7. * 参考资料0:数据结构(C语言版)严蔚敏
  8. *
  9. * 参考资料1:http://zhidao.baidu.com/question/81938912.html
  10. *
  11. * 参考资料2:http://cslibrary.stanford.edu/110/BinaryTrees.html#java
  12. *
  13. * @author ocaicai@yeah.net @date: 2011-5-17
  14. *
  15. */
  16. public class BinTreeTraverse2 {
  17. private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  18. private static List<Node> nodeList = null;
  19. /**
  20. * 内部类:节点
  21. *
  22. * @author ocaicai@yeah.net @date: 2011-5-17
  23. *
  24. */
  25. private static class Node {
  26. Node leftChild;
  27. Node rightChild;
  28. int data;
  29. Node(int newData) {
  30. leftChild = null;
  31. rightChild = null;
  32. data = newData;
  33. }
  34. }
  35. public void createBinTree() {
  36. nodeList = new LinkedList<Node>();
  37. // 将一个数组的值依次转换为Node节点
  38. for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
  39. nodeList.add(new Node(array[nodeIndex]));
  40. }
  41. // 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
  42. for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
  43. // 左孩子
  44. nodeList.get(parentIndex).leftChild = nodeList
  45. .get(parentIndex * 2 + 1);
  46. // 右孩子
  47. nodeList.get(parentIndex).rightChild = nodeList
  48. .get(parentIndex * 2 + 2);
  49. }
  50. // 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
  51. int lastParentIndex = array.length / 2 - 1;
  52. // 左孩子
  53. nodeList.get(lastParentIndex).leftChild = nodeList
  54. .get(lastParentIndex * 2 + 1);
  55. // 右孩子,如果数组的长度为奇数才建立右孩子
  56. if (array.length % 2 == 1) {
  57. nodeList.get(lastParentIndex).rightChild = nodeList
  58. .get(lastParentIndex * 2 + 2);
  59. }
  60. }
  61. /**
  62. * 先序遍历
  63. *
  64. * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
  65. *
  66. * @param node
  67. *            遍历的节点
  68. */
  69. public static void preOrderTraverse(Node node) {
  70. if (node == null)
  71. return;
  72. System.out.print(node.data + " ");
  73. preOrderTraverse(node.leftChild);
  74. preOrderTraverse(node.rightChild);
  75. }
  76. /**
  77. * 中序遍历
  78. *
  79. * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
  80. *
  81. * @param node
  82. *            遍历的节点
  83. */
  84. public static void inOrderTraverse(Node node) {
  85. if (node == null)
  86. return;
  87. inOrderTraverse(node.leftChild);
  88. System.out.print(node.data + " ");
  89. inOrderTraverse(node.rightChild);
  90. }
  91. /**
  92. * 后序遍历
  93. *
  94. * 这三种不同的遍历结构都是一样的,只是先后顺序不一样而已
  95. *
  96. * @param node
  97. *            遍历的节点
  98. */
  99. public static void postOrderTraverse(Node node) {
  100. if (node == null)
  101. return;
  102. postOrderTraverse(node.leftChild);
  103. postOrderTraverse(node.rightChild);
  104. System.out.print(node.data + " ");
  105. }
  106. public static void main(String[] args) {
  107. BinTreeTraverse2 binTree = new BinTreeTraverse2();
  108. binTree.createBinTree();
  109. // nodeList中第0个索引处的值即为根节点
  110. Node root = nodeList.get(0);
  111. System.out.println("先序遍历:");
  112. preOrderTraverse(root);
  113. System.out.println();
  114. System.out.println("中序遍历:");
  115. inOrderTraverse(root);
  116. System.out.println();
  117. System.out.println("后序遍历:");
  118. postOrderTraverse(root);
  119. }
  120. }

输出结果:

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

java实现二叉树的构建以及3种遍历方法的更多相关文章

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

    转载自http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿 ...

  2. java实现二叉树的构建以及3种遍历方法(转)

    转 原地址:http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历 ...

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

    本来就是基础知识,不能丢的太干净,今天竟然花了那么长的时间才写出来,记一下. 有如下的一颗完全二叉树: 先序遍历结果应该为:1  2  4  5  3  6  7 中序遍历结果应该为:4  2  5 ...

  4. Java中Map的三种遍历方法

    Map的三种遍历方法: 1. 使用keySet遍历,while循环: 2. 使用entrySet遍历,while循环: 3. 使用for循环遍历.   告诉您们一个小秘密: (下↓面是测试代码,最爱看 ...

  5. Java List /ArrayList 三种遍历方法

    java list三种遍历方法性能比较http://www.cnblogs.com/riskyer/p/3320357.html JAVA LIST 遍历http://blog.csdn.net/lo ...

  6. 2017.10.25 Java List /ArrayList 三种遍历方法

    java list三种遍历方法性能比较 学习java语言list遍历的三种方法,顺便测试各种遍历方法的性能,测试方法为在ArrayList中插入记录,然后遍历ArrayList,测试代码如下: pac ...

  7. javase-常用三种遍历方法

    javase-常用三种遍历方法 import java.util.ArrayList; import java.util.Iterator; import java.util.List; public ...

  8. HashMap的四种遍历方法,及效率比较(简单明了)

    https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, Str ...

  9. Java中关于 ArrayList 和 Map 的常用遍历方法 (学习笔记,便于以后查询)

    一.学习ArrayList与Map时,关于常用遍历方法的记录如下:  二.附源码如下: package com.study.in.myself; import java.util.ArrayList; ...

随机推荐

  1. 我的python之路【第二篇】数据类型与方法

    一.Python中有哪些数据类型 整型 在32位的系统中: 取值范围就是-(2^31) 到2^31-1 在64位系统中:   取值范围就是-(2^63) 到2^63-1 浮点型 布尔型 字符型 字符串 ...

  2. linux最常用命令

    1,cd命令   作用:切换当前目录,它的参数切换的路劲,可以是相对路劲,也可以是绝对路劲. 用法: cd /root/Docements #切换当/root/Docements,绝对路劲 cd ./ ...

  3. win7下nsis打包exe安装程序教程

    下载软件包: NSIS中文版 :https://pan.baidu.com/s/1mitSQU0 装好之后会出现两个软件:Nullsoft Install System 和 VNISEdit 编译环境 ...

  4. web中关于垃圾回收的一些观点

    感觉dom大神的解惑 关于引用计数法,注意引用的方向性就行.  A.addEventListner(B.func), 那么是增加了A对B的引用.如果A是不可回收的对象,比如全局的Stage,或者单例. ...

  5. 我是如何处理大并发量订单处理的 KafKa部署总结

    今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为公司需要它. 网上已经有很多怎么用和用到哪的 ...

  6. 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化

    老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化   首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...

  7. display与visibility的使用(区别)

    display:none;隐藏元素,且此元素无物理位置: visibility:hidden;隐藏元素,但元素的物理位置依然存在: 因为display:none导致页面上无此元素的空间,js就获取不到 ...

  8. 使用mysql索引技巧及注意事项

    一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重. 在数据 ...

  9. SQL零星技术点:SQL中转换money类型数值转换为字符串问题

    --SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...

  10. php流程管理

    流程控制即某个人发起一个流程,通过一层一层审核,通过后,完成整个流程,若有一层审核未通过,中断整个流程.即结束! 比如请假流程: 某一员工发起一个请假流程,那么这个流程的节点人员即他的上级,上上级,上 ...