分类: 数据结构及算法2012-04-28 14:30 8572人阅读 评论(6) 收藏 举报

利用栈实现二叉树的先序,中序,后序遍历的非递归操作

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <stdlib.h>
  4. #include <queue>
  5. #include <stack>
  6. #include <iostream>
  7. using namespace std;
  8. typedef struct BiTNode{
  9. char data;
  10. BiTNode *lchild, *rchild;
  11. }BiTNode,*BiTree;
  12. void CreateBiTree(BiTree &T)//建树,按先序顺序输入节点
  13. {
  14. char ch;
  15. scanf("%c",&ch);
  16. if(ch==' ')
  17. {
  18. T=NULL;
  19. return;
  20. }
  21. else
  22. {
  23. T=(BiTree)malloc(sizeof(BiTNode));
  24. if(!T)
  25. exit(1);
  26. T->data=ch;
  27. CreateBiTree(T->lchild);
  28. CreateBiTree(T->rchild);
  29. }
  30. }
  31. void InOrderTraverse(BiTree T)//非递归中序遍历
  32. {
  33. stack<BiTree> Stack;
  34. if(!T)
  35. {
  36. printf("空树!\n");
  37. return;
  38. }
  39. while(T || !Stack.empty())
  40. {
  41. while(T)
  42. {
  43. Stack.push(T);
  44. T=T->lchild;
  45. }
  46. T=Stack.top();
  47. Stack.pop();
  48. printf("%c",T->data);
  49. T=T->rchild;
  50. }
  51. }
  52. void PreOrderTraverse(BiTree T)//非递归先序遍历
  53. {
  54. stack<BiTree> Stack;
  55. if(!T)
  56. {
  57. printf("空树!\n");
  58. return;
  59. }
  60. while(T || !Stack.empty())
  61. {
  62. while(T)
  63. {
  64. Stack.push(T);
  65. printf("%c",T->data);
  66. T=T->lchild;
  67. }
  68. T=Stack.top();
  69. Stack.pop();
  70. T=T->rchild;
  71. }
  72. }
  73. void PostOrderTraverse(BiTree T)//非递归后序遍历,用一个标记标记右子树是否访问过
  74. {
  75. int flag[20];
  76. stack<BiTree> Stack;
  77. if(!T)
  78. {
  79. printf("空树!\n");
  80. return;
  81. }
  82. while(T)
  83. {
  84. Stack.push(T);
  85. flag[Stack.size()]=0;
  86. T=T->lchild;
  87. }
  88. while(!Stack.empty())
  89. {
  90. T=Stack.top();
  91. while(T->rchild && flag[Stack.size()]==0)
  92. {
  93. flag[Stack.size()]=1;
  94. T=T->rchild;
  95. while(T)
  96. {
  97. Stack.push(T);
  98. flag[Stack.size()]=0;
  99. T=T->lchild;
  100. }
  101. }
  102. T=Stack.top();
  103. printf("%c",T->data);
  104. Stack.pop();
  105. }
  106. }
  107. void main()
  108. {
  109. BiTree T;
  110. CreateBiTree(T);
  111. PreOrderTraverse(T);
  112. printf("\n");
  113. InOrderTraverse(T);
  114. printf("\n");
  115. PostOrderTraverse(T);
  116. printf("\n");
  117. }
 

ZT 二叉树先序,中序,后序遍历非递归实现的更多相关文章

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

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

  2. 【算法】二叉树、N叉树先序、中序、后序、BFS、DFS遍历的递归和迭代实现记录(Java版)

    本文总结了刷LeetCode过程中,有关树的遍历的相关代码实现,包括了二叉树.N叉树先序.中序.后序.BFS.DFS遍历的递归和迭代实现.这也是解决树的遍历问题的固定套路. 一.二叉树的先序.中序.后 ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

随机推荐

  1. 阿里巴巴Java开发手册(详尽版)-个人未注意到的知识点(转)

    转自 https://blog.csdn.net/u013039395/article/details/86528164 一.编程规约 (一) 命名风格 [强制]代码中的命名只可用英文方式 [强制]类 ...

  2. orcle查询记录的每天的第一条

    select * from (      select elec,time,Row_Number() OVER (partition by trunc(TIME) order by time) ran ...

  3. javaScript中用eval()方法转换json对象

    var u = eval('('+user+')'); 1.对于服务器返回的JSON字符串,如果jQuery异步请求没做类型说明,或者以字符串方式接受,那么需要做一次对象化处理,方式不是太麻烦,就是将 ...

  4. 云存储(Swift+Keystone)部署策略

    Swift是OpenStack的对象存储模块,Keystone是OpenStack的权限验证模块.可以于这两个模块搭建一个较为完善的云存储系统. 1.官方方案 云存储的服务器分三种类型: 验证节点 A ...

  5. 以中间件,路由,跨进程事件的姿势使用WebSocket--Node.js篇

    上一篇文章介绍了在浏览器端以中间件,路由,跨进程事件的姿势使用原生WebSocket.这篇文章将介绍如何使用Node.js以相同的编程模式来实现WebSocket服务端. Node.js中比较流行的两 ...

  6. JavaWeb项目WebContent下的资源文件无法引用

    JavaWeb项目引用资源的时候尽量使用绝对路径. 作者在帮助同学完善其JavaWeb项目端页面的时候,css样式文件怎么也引用不了. 第一个想到的是:是不是文件路径写错了? 于是,作者换了绝对路径, ...

  7. hdu2036(多边形面积)

    Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)” 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而 ...

  8. 使用引用类型变量来访问所引用对象的属性和方法时,Java 虚拟机绑定规则

    通过引用类型变量来访问所引用对象的属性和方法时,Java 虚拟机将采用以下绑定规则: 实例方法与引用变量实际引用的对象的方法进行绑定,这种绑定属于动态绑定,因为是在运行时由 Java 虚拟机动态决定的 ...

  9. span与a元素的键盘聚焦性以及键盘点击性研究——张鑫旭

    一.众所周知的与不为所知的 我们平时涉及点击交互事件的时候,都是使用的a元素或者button元素,原因是可以相应键盘focus效果以及回车触发点击事件,这是众所周知的. 但是,可能存在一些特殊情况,我 ...

  10. Android手动显示和隐藏软键盘

    1.方法一(如果输入法在窗口上已经显示,则隐藏,反之则显示) InputMethodManager imm = (InputMethodManager) getSystemService(Contex ...