第十章:基本数据结构(2)
请写出一个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.栈和队列 栈和队列 ...
- 第十章 基本数据结构——链表
链表 链表与数组的区别是链表中的元素顺序是有各对象中的指针决定的,相邻元素之间在物理内存上不一定相邻.采用链表可以灵活地表示动态集合.链表有单链表和双链表及循环链表.书中着重介绍了双链表的概念及操作 ...
- 第十章 Java数据结构
第一节 数组 数组是一个存放多个数据的容器 - 数据是同一类型 - 所有的数据是线性规则排列 - 可用过位置索引来快速定位访问数据 - 需明确容器的长度 第二节 Java Collection Fra ...
- 算法导论中C语言代码,算法导论-学习笔记与进度
算法导论 阅读进度 第一部分 基础知识 第一章 计算中算法的角色 Done 1.1 算法 输入与输出 算法可以解决哪些问题 数据结构 技术 一些比较难的问题 1.2 作为一种技术的算法 效率 算法和其 ...
- 期末Java面向对象程序设计复习稳过不挂指南(更新中)
目录 第三章.java类基础知识 第四节.自定义函数 ·同一个类中,函数名称可以相同,即重载函数(overload),但函数参数的个数或者类型必须不同 第四章.面向对象和类 第一节.面向对象思想 ·对 ...
- 给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构(算法导论第十章10.4-3)
给定一个n节点的二叉树,写出一个O(n)时间非递归过程,将该树每个节点关键字输出,可以使用一个栈作为辅助数据结构 (算法导论第十章10.4-3) template<typename T> ...
- 【Java数据结构与算法】第十章 哈希表和二叉树
第十章 哈希表和二叉树 文章目录 第十章 哈希表和二叉树 一.哈希表 1.介绍 2.代码实现 二.二叉树 1.介绍 2.遍历二叉树 3.查找二叉树 4.二叉树删除节点 5.二叉树综合实例 一.哈希表 ...
- 【Java数据结构与算法】第二十章 Dijkstra算法和Floyd算法
第二十章 Dijkstra算法和Floyd算法 文章目录 第二十章 Dijkstra算法和Floyd算法 一.Dijkstra算法 1.介绍 2.代码实现 二.Floyd算法 1.介绍 2.代码实现 ...
- 数据结构思维 第十章 哈希
第十章 哈希 原文:Chapter 10 Hashing 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 在本章中,我定义了一个比MyLinearMap更好的Map接口实现,My ...
最新文章
- 经典论文复现 | LSGAN:最小二乘生成对抗网络
- FAT16文件系统结构扇区数据分析
- 来自韩国的优秀Java应用性能监控软件JENNIFER
- 《R语言实战》第1章
- virtual background for conference
- 解决webpack打包后-webkit-box-orient: vertical ;消失问题
- jQuery Mobile 基础(第三章)
- thinkserver rd650管理口地址_路由器WAN口和LAN口有什么区别【区别介绍】
- 【registry】 javax.el.ExpressionFactory.newInstance()Ljavax/el/ExpressionFactory;
- java离线数据处理_DATAX 异构数据源离线同步工具
- vue递归组件eventBus策略解决父子组件通讯问题
- 11月6日云栖精选夜读:阿里云双11访谈之云安全
- 【linux基础】linux不能进入系统
- PostgreSQL 日常数据库维护工作
- hibernate-annotation
- java 读取yaml配置文件
- 【C语言】实现 4阶(经典)龙格-库塔法 求解二阶微分方程
- ATX电源工作原理的学习
- SQL server 2008 定义数据类型
- 在nsa组网架构中,3gpp定义的nr与epc的接口是什么