以下是我要解析的一个二叉树的模型形状

接下来废话不多直接上代码

一种是用递归的方法,另一种是用堆栈的方法:

首先创建一棵树:

  

  1. public class Node {
  2. private int data;
  3. private Node leftNode;
  4. private Node rightNode;
  5. public Node(int data, Node leftNode, Node rightNode){
  6. this.data = data;
  7. this.leftNode = leftNode;
  8. this.rightNode = rightNode;
  9. }
  10.  
  11. public int getData() {
  12. return data;
  13. }
  14. public void setData(int data) {
  15. this.data = data;
  16. }
  17. public Node getLeftNode() {
  18. return leftNode;
  19. }
  20. public void setLeftNode(Node leftNode) {
  21. this.leftNode = leftNode;
  22. }
  23. public Node getRightNode() {
  24. return rightNode;
  25. }
  26. public void setRightNode(Node rightNode) {
  27. this.rightNode = rightNode;
  28. }
  29. }

递归:

  1. public class BinaryTree {
  2. /**
  3. * @author yaobo
  4. * 二叉树的先序中序后序排序
  5. */
  6. public Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错
  7. Node J = new Node(, null, null);
  8. Node H = new Node(, null, null);
  9. Node G = new Node(, null, null);
  10. Node F = new Node(, null, J);
  11. Node E = new Node(, H, null);
  12. Node D = new Node(, null, G);
  13. Node C = new Node(, F, null);
  14. Node B = new Node(, D, E);
  15. Node A = new Node(, B, C);
  16. return A; //返回根节点
  17. }
  18.  
  19. public void printNode(Node node){
  20. System.out.print(node.getData());
  21. }
  22. public void theFirstTraversal(Node root) { //先序遍历
  23. printNode(root);
  24. if (root.getLeftNode() != null) { //使用递归进行遍历左孩子
  25. theFirstTraversal(root.getLeftNode());
  26. }
  27. if (root.getRightNode() != null) { //递归遍历右孩子
  28. theFirstTraversal(root.getRightNode());
  29. }
  30. }
  31. public void theInOrderTraversal(Node root) { //中序遍历
  32. if (root.getLeftNode() != null) {
  33. theInOrderTraversal(root.getLeftNode());
  34. }
  35. printNode(root);
  36. if (root.getRightNode() != null) {
  37. theInOrderTraversal(root.getRightNode());
  38. }
  39. }
  40.  
  41. public void thePostOrderTraversal(Node root) { //后序遍历
  42. if (root.getLeftNode() != null) {
  43. thePostOrderTraversal(root.getLeftNode());
  44. }
  45. if(root.getRightNode() != null) {
  46. thePostOrderTraversal(root.getRightNode());
  47. }
  48. printNode(root);
  49. }
  50.  
  51. public static void main(String[] args) {
  52. BinaryTree tree = new BinaryTree();
  53. Node root = tree.init();
  54. System.out.println("先序遍历");
  55. tree.theFirstTraversal(root);
  56. System.out.println("");
  57. System.out.println("中序遍历");
  58. tree.theInOrderTraversal(root);
  59. System.out.println("");
  60. System.out.println("后序遍历");
  61. tree.thePostOrderTraversal(root);
  62. System.out.println("");
  63. }
  64. }

堆栈:

 

  1. public class BinaryTree1 {
  2. public Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错
  3. Node J = new Node(, null, null);
  4. Node H = new Node(, null, null);
  5. Node G = new Node(, null, null);
  6. Node F = new Node(, null, J);
  7. Node E = new Node(, H, null);
  8. Node D = new Node(, null, G);
  9. Node C = new Node(, F, null);
  10. Node B = new Node(, D, E);
  11. Node A = new Node(, B, C);
  12. return A; //返回根节点
  13. }
  14.  
  15. public void printNode(Node node){
  16. System.out.print(node.getData());
  17. }
  18.  
  19. public void theFirstTraversal_Stack(Node root) { //先序遍历
  20. Stack<Node> stack = new Stack<Node>();
  21. Node node = root;
  22. while (node != null || stack.size() > ) { //将所有左孩子压栈
  23. if (node != null) { //压栈之前先访问
  24. printNode(node);
  25. stack.push(node);
  26. node = node.getLeftNode();
  27. } else {
  28. node = stack.pop();
  29. node = node.getRightNode();
  30. }
  31. }
  32. }
  33.  
  34. public void theInOrderTraversal_Stack(Node root) { //中序遍历
  35. Stack<Node> stack = new Stack<Node>();
  36. Node node = root;
  37. while (node != null || stack.size() > ) {
  38. if (node != null) {
  39. stack.push(node); //直接压栈
  40. node = node.getLeftNode();
  41. } else {
  42. node = stack.pop(); //出栈并访问
  43. printNode(node);
  44. node = node.getRightNode();
  45. }
  46. }
  47. }
  48.  
  49. public void thePostOrderTraversal_Stack(Node root) { //后序遍历
  50. Stack<Node> stack = new Stack<Node>();
  51. Stack<Node> output = new Stack<Node>();//构造一个中间栈来存储逆后序遍历的结果
  52. Node node = root;
  53. while (node != null || stack.size() > ) {
  54. if (node != null) {
  55. output.push(node);
  56. stack.push(node);
  57. node = node.getRightNode();
  58. } else {
  59. node = stack.pop();
  60. node = node.getLeftNode();
  61. }
  62. }
  63. System.out.println(output.size());
  64. while (output.size() > ) {
  65.  
  66. printNode(output.pop());
  67. }
  68. }
  69.  
  70. public static void main(String[] args) {
  71. BinaryTree1 tree = new BinaryTree1();
  72. Node root = tree.init();
  73. System.out.println("先序遍历");
  74. tree.theFirstTraversal_Stack(root);
  75. System.out.println("");
  76. System.out.println("中序遍历");
  77. tree.theInOrderTraversal_Stack(root);
  78. System.out.println("");
  79. System.out.println("后序遍历");
  80. tree.thePostOrderTraversal_Stack(root);
  81. System.out.println("");
  82. }
  83. }

Java实现二叉树先序,中序,后序遍历的更多相关文章

  1. 分别求二叉树前、中、后序的第k个节点

    一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 ; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' ...

  2. [Java]算术表达式求值之二(中序表达式转后序表达式方案,支持小数)

    Inlet类,入口类,这个类的主要用途是验证用户输入的算术表达式: package com.hy; import java.io.BufferedReader; import java.io.IOEx ...

  3. [Java]算术表达式求值之一(中序表达式转后序表达式方案)

    第二版请见:https://www.cnblogs.com/xiandedanteng/p/11451359.html 入口类,这个类的主要用途是粗筛用户输入的算术表达式: package com.h ...

  4. 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别

    前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...

  5. 已知树的前序、中序,求后序的java实现&已知树的后序、中序,求前序的java实现

    public class Order { int findPosInInOrder(String str,String in,int position){ char c = str.charAt(po ...

  6. DS Tree 已知先序、中序 => 建树 => 求后序

    参考:二叉树--前序和中序得到后序 思路历程: 在最初敲的时候,经常会弄混preorder和midorder的元素位置.大体的思路就是在preorder中找到根节点(根节点在序列的左边),然后在mid ...

  7. TZOJ 3209 后序遍历(已知中序前序求后序)

    描述 在数据结构中,遍历是二叉树最重要的操作之一.所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问. 这里给出三种遍历算法. 1.中序遍历的递归算法定义:  ...

  8. java 根据二叉树前序 ,中序求后续

    在一棵二叉树总,前序遍历结果为:ABDGCEFH,中序遍历结果为:DGBAECHF,求后序遍历结果. 我们知道: 前序遍历方式为:根节点->左子树->右子树 中序遍历方式为:左子树-> ...

  9. hdu1710-Binary Tree Traversals (由二叉树的先序序列和中序序列求后序序列)

    http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (Java ...

  10. LeetCode:二叉树的前、中、后序遍历

    描述: ------------------------------------------------------- 前序遍历: Given a binary tree, return the pr ...

随机推荐

  1. php5.3.*编译出现make: *** [ext/gd/libgd/gd_compat.lo] Error 1 解决方法

     升级系统,把php5.2.9升级到5.3.6,按照以前的编译参数,configure能正常通过,但是在make的时候提示: In file included from /root/php-5.3.6 ...

  2. Chrome浏览器网页截全屏算法以及实现

    做个一个简单的批量下载插件叫“挖一下”, 正如插件的名字一样,采集网页里面的所有图片,根据筛选条件过滤不需要的图片,最后下载选中的图片. 索性把网页也一起给截了,截屏分两种: 1.可见内容截屏 2.完 ...

  3. CPU内存管理和linux内存分页机制

    一.概念 物理地址(physical address)用于内存芯片级的单元寻址,与处理器和CPU连接的地址总线相对应.——这个概念应该是这几个概念中最好理解的一个,但是值得一提的是,虽然可以直接把物理 ...

  4. 读书笔记:《HTML5开发手册》Web表单

    这是补充HTML5基础知识的第五篇内容,其他为: 一.HTML5-- 新的结构元素 二.HTML5-- figure.time.details.mark 三.HTML5-- details活学活用 四 ...

  5. ETL的经验总结

    ETL的考虑        做数据仓库系统,ETL是关键的一环.说大了,ETL是数据整合解决方案,说小了,就是倒数据的工具.回忆一下工作这么些年来,处理数据迁移.转换的工作倒还真的不少.但是那些工作基 ...

  6. TreeView控制消息

    控制消息的作用 通过发送消息到Treeview控件, 就能够控机Treeview控件.常用的控制有: 获取被点击的节点 获取节点的文本 设置节点的文本 获取节点的父节点 获取节点的子节点 TVM_GE ...

  7. android 蓝牙连接与通讯(Bluetooth)

    最近做了一个小项目,关于蓝牙的一个智能硬件.其中涉及到了蓝牙模块的操作.特记下蓝牙模块的操作过程.只记录下关于蓝牙部分的操作,具体业务逻辑不涉及其中.重点是记录下蓝牙的扫描.链接.通讯. 在使用蓝牙模 ...

  8. radio里面value值与其他字符进行比较

    本题旨在创建一个具有及时反馈的选择题,当选完其中一个选项后,会有弹窗来提醒你选择的答案是正确还是错误的.<div id="text" style="display: ...

  9. Latex 使用小技巧

    Latex引用多篇参考文献 连续引用参考文献时中间中破折号连起来:[1,2,3,4]—>[1-4] 这是只需要在文档开始加入下面语句命令: \usepackage[numbers,sort&am ...

  10. 在2002年的老电脑上安装Debian

    在2002年自己花了家里八千多元买了一台联想昭笔记本电脑.配置是PIII 750 Hz, 128 MB内存(后来升级到了320 MB).那个时候大学里买笔记本电脑的人还不多,宿舍里的同学大都攒的台式机 ...