转载自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. io与Nio的区别及实用场景

    https://blog.csdn.net/wodeyuer125/article/details/39475207

  2. Hibernate 提供session的工具类HibernateUtils

    package cn.itcast.utils; import java.sql.Connection; import java.sql.SQLException; import org.hibern ...

  3. html和node.js实现websocket

    websocket websocket是HTML5开始提供的一种单个TCP连接上进行全双工通讯的协议.它让客户端和服务端之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.浏览器和服务器只需要 ...

  4. js加减乘除精确计算

    Javascript精确计算时的bug JS无法进行精确计算的bug 在做CRM,二代审核需求审核详情页面时.需要按比例(后端传类似0.8的小数)把用户输入的数字显示在不同的地方. 在做dubheIn ...

  5. 初探12C碰到的那些“坑”

    一个昏天黑地的早上,刚搭建的系统忽然遭遇严重数据库问题.于是,主要人物闪亮登场了,他们分别是友商人员小灰和DBA小Y. 事情的开始,小Y接到小灰紧急救助电话... 小灰:小Y,我是友商的小灰,刚搭建的 ...

  6. Linux用户与组管理命令

    1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可. who | cut -d" " -f1 | sort -u 或 who | cut -d ...

  7. Linux中的代码编辑器vim

    Vim的三种工作模式 命令行模式 插入模式 底行模式 Vim 的命令行模式 命令行模式是进入vim后的初始模式,在该模式下主要是使用方向键来移动光标的位置,并通过相应的命令来进行文字的编辑. 切换方法 ...

  8. 谈一谈如何远程访问MySQL(腾讯云,云主机)

    连接MySQL (其他的sql 基本相同套路) 腾讯云不管怎么设置端口和MySQL权限以及监听端口就是不能连接? 远程访问MySQL数据库的几个关键点 端口设置 数据库权限设置 数据库的监听端口设置 ...

  9. Makefile (3) 基本语法和使用

    make是用来管理一个工程项目的工具 . Makefile就是这个项目文件 . 1.Makefile 是由若干条规则组成的,每个规则的语法如下所示 : #规则 targets: prerequisit ...

  10. C++基础 C++对类的管理——封装

    1.封装 两层含义: (1)把事物的属性和方法结合成个整体. (2)对类的属性和方法进行访问控制,对不信的进行信息屏蔽. 2.访问控制 控制分为 类的内部,类的外部. public 修饰的成员,可在内 ...