请写出一个O(n)时间的非递归过程,将给定的n节点二叉树中每个节点的关键字输出来。可以利用栈作为辅助数组数据结构。

中序输出

PUSH(root)

while !empty_stack(S)

  if root->left

    PUSH(root->left)

    root<-root->left

  else

    root<-POP(S)

    打印root数据

    while !root->right&&!empty_stack(S)

      root<-POP(S)

      打印root数据

    if root->right 

      PUSH(root->right)

      root<-root->right

前序输出

PUSH(root)

while !empty_stack(S)

  root<-POP(S)

  打印root数据

  if root->right

    PUSH(root->right)

  if root->left

    PUSH(root->left)

后序输出

PUSH(root)

while !empty_stack(S)

  if root->right||root->left

    if root->left

      if root->right

        PUSH(root->right)

      PUSH(root->left)

      root<-root->left

    else

      PUSH(root->right)

      root<-root->right

  else  

    root<-POP(S)

    打印root数据

    while !empty_stack(S)

      p=POP(S)

      if p->left==root||p->right==root

        打印root数据

        root=p

      else

        root=p;

        PUSH(root)

        break

 1 typedef int Data;
 2
 3 struct TreeNode{
 4     Data data;
 5     TreeNode *left;
 6     TreeNode *right;
 7 };
 8
 9 /*
10 建立一棵num个元素的有序二叉树
11 */
12 TreeNode *create_tree(int num){
13     TreeNode *root,*p,*child,*parent;
14     int i=0;
15     p=(TreeNode *)malloc(sizeof(TreeNode));
16     p->left=p->right=NULL;
17     cin>>p->data;
18     child=root=p;
19     while (++i<num){
20         p=(TreeNode *)malloc(sizeof(TreeNode));
21         p->left=p->right=NULL;
22         cin>>p->data;
23         while (child){
24             parent=child;
25             if ((p->data)>(child->data)){
26                 child=child->right;
27             }else{
28                 child=child->left;
29             }
30         }
31         if (p->data>parent->data){
32             parent->right=p;
33         }else{
34             parent->left=p;
35         }
36         child=root;
37     }
38     return root;
39 }

 1 //非递归中序输出
 2 void midOrder(TreeNode *t){
 3     Stack s={0};
 4     TreeNode *p=NULL;
 5     push(&s,t);
 6     while(!empty_stack(&s)){
 7         if (t->left){
 8             push(&s,t->left);
 9             t=t->left;
10         }else{
11             t=pop(&s);
12             cout<<t->data<<ends;
13             while (!(t->right)&&!empty_stack(&s)){
14                 t=pop(&s);
15                 cout<<t->data<<ends;
16             }
17             if (t->right){
18                 push(&s,t->right);
19                 t=t->right;
20             }
21         }
22     }
23 }
24
25 //非递归前序输出
26 void preOrder(TreeNode *t){
27     Stack s={0};
28     TreeNode *p=NULL;
29     push(&s,t);
30     while (!empty_stack(&s)){
31         t=pop(&s);
32         cout<<t->data<<ends;
33         if (t->right){
34             push(&s,t->right);
35         }
36         if (t->left){
37             push(&s,t->left);
38         }
39     }
40 }
41
42 //非递归后序输出
43 void postOrder(TreeNode *t){
44     Stack s={0};
45     TreeNode *p=NULL;
46     push(&s,t);
47     while (!empty_stack(&s)){
48         if (t->left||t->right){        //如果t有孩子,则将孩子入栈
49             if (t->left){
50                 if (t->right){
51                     push(&s,t->right);
52                 }
53                 push(&s,t->left);
54                 t=t->left;
55             }else{
56                 push(&s,t->right);
57                 t=t->right;
58             }
59         }else{
60             t=pop(&s);            //从栈中取出叶子节点t
61             cout<<t->data<<ends;
62             while (!empty_stack(&s)){
63                 p=pop(&s);                    //取出上一个压入栈的节点
64                 if (p->left==t||p->right==t){//判断该节点是不是t的父节点,如果是则输出数据
65                     cout<<p->data<<ends;
66                     t=p;
67                 }else{
68                     t=p;
69                     push(&s,p);
70                     break;
71                 }
72             }
73         }
74     }
75 }

   

    

    

转载于:https://www.cnblogs.com/lsf90/p/3145009.html

第十章:基本数据结构(2)相关推荐

  1. 第十章 基本数据结构——栈和队列

    摘要 本章介绍了几种基本的数据结构,包括栈.队列.链表以及有根树,讨论了使用指针的简单数据结构来表示动态集合.本章的内容对于学过数据结构的人来说,没有什么难处,简单的总结一下. 1.栈和队列 栈和队列 ...

  2. 第十章 基本数据结构——链表

     链表 链表与数组的区别是链表中的元素顺序是有各对象中的指针决定的,相邻元素之间在物理内存上不一定相邻.采用链表可以灵活地表示动态集合.链表有单链表和双链表及循环链表.书中着重介绍了双链表的概念及操作 ...

  3. 第十章 Java数据结构

    第一节 数组 数组是一个存放多个数据的容器 - 数据是同一类型 - 所有的数据是线性规则排列 - 可用过位置索引来快速定位访问数据 - 需明确容器的长度 第二节 Java Collection Fra ...

  4. 算法导论中C语言代码,算法导论-学习笔记与进度

    算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...

  5. 期末Java面向对象程序设计复习稳过不挂指南(更新中)

    目录 第三章.java类基础知识 第四节.自定义函数 ·同一个类中,函数名称可以相同,即重载函数(overload),但函数参数的个数或者类型必须不同 第四章.面向对象和类 第一节.面向对象思想 ·对 ...

  6. 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)

    给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...

  7. 【Java数据结构与算法】第十章 哈希表和二叉树

    第十章 哈希表和二叉树 文章目录 第十章 哈希表和二叉树 一.哈希表 1.介绍 2.代码实现 二.二叉树 1.介绍 2.遍历二叉树 3.查找二叉树 4.二叉树删除节点 5.二叉树综合实例 一.哈希表 ...

  8. 【Java数据结构与算法】第二十章 Dijkstra算法和Floyd算法

    第二十章 Dijkstra算法和Floyd算法 文章目录 第二十章 Dijkstra算法和Floyd算法 一.Dijkstra算法 1.介绍 2.代码实现 二.Floyd算法 1.介绍 2.代码实现 ...

  9. 数据结构思维 第十章 哈希

    第十章 哈希 原文:Chapter 10 Hashing 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 在本章中,我定义了一个比MyLinearMap更好的Map接口实现,My ...

最新文章

  1. 经典论文复现 | LSGAN:最小二乘生成对抗网络
  2. FAT16文件系统结构扇区数据分析
  3. 来自韩国的优秀Java应用性能监控软件JENNIFER
  4. 《R语言实战》第1章
  5. virtual background for conference
  6. 解决webpack打包后-webkit-box-orient: vertical ;消失问题
  7. jQuery Mobile 基础(第三章)
  8. thinkserver rd650管理口地址_路由器WAN口和LAN口有什么区别【区别介绍】
  9. 【registry】 javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;
  10. java离线数据处理_DATAX 异构数据源离线同步工具
  11. vue递归组件eventBus策略解决父子组件通讯问题
  12. 11月6日云栖精选夜读:阿里云双11访谈之云安全
  13. 【linux基础】linux不能进入系统
  14. PostgreSQL 日常数据库维护工作
  15. hibernate-annotation
  16. java 读取yaml配置文件
  17. 【C语言】实现 4阶(经典)龙格-库塔法 求解二阶微分方程
  18. ATX电源工作原理的学习
  19. SQL server 2008 定义数据类型
  20. 在nsa组网架构中,3gpp定义的nr与epc的接口是什么

热门文章

  1. AlphaZero完胜三大世界冠军棋类程序:5000个TPU、自学一天
  2. Haystack-全文搜索框架
  3. oracle 12c dbca 无法发现 asm diskgroup
  4. Linux系统管理和维护常用命令
  5. redis的简单安装和配置文件的参数
  6. php随机数怎么获取?一个简单的函数就能生成
  7. github上完成个人的站点搭建
  8. IT民工系列——通用7130芯片视频采集卡 SDK 兼容任意天敏 宏视 等板卡
  9. Netty学习笔记(一) 实现DISCARD服务
  10. 小程序自定义数字键盘|仿微信支付、支付宝支付密码键盘