//算法导论10.4-5及12.1-3
//1. 10.4-5
//给定一个n节点的二叉树,写出一个O(n)时间的非递归过程,将该树每个节点的关键
//字输出。要求除该树本身的存储空间外只能使用固定量的额外存储空间,且在过程中
//不得修改该树,及时暂时的修改也不允许。
//2. 12.1-3
//设计一个执行中序遍历的非递归程序(提示:一种容易的方法是使用栈作为辅助数据
//结构;另一种比较复杂但比较简洁的做法是不使用栈,但要假设能测试两个指针是否
//相等。)
struct tree
{int val;tree *left,*right,*parent;
};void print(tree *x)
{cout<<x->val<<"  ";
}
//最简单的递归实现
void inorder_tree (tree *x)
{if(!x) return;inorder_tree (x->left);print(x);inorder_tree (x->right);
}//用栈辅助实习二叉树非递归遍历
//不需要使用父节点指针
stack<tree *> st;
void inorder_tree_stack(tree* x)
{while(x || !st.empty()) {//一路向左,不断将当前节点压入栈中while(x){st.push(x);x=x->left;}//取出栈顶元素,输出,并遍历其右节点x=st.top();st.pop();print(x);x=x->right;}
}
//非递归的中序遍历树,不用栈实现,但需要父节点指针
//一共有3种情况
//1. 访问左孩子
//2. 访问右孩子
//3. 如果是从右孩子返回,表明整棵子树已访问完,需要沿树而上寻找父节点。
//   直到是从左孩子返回,或者访问到根节点的父节点void inorder_tree_nostack(tree *x)
{if(!x) return;tree *y=NULL;while(true){//访问左孩子if(y != x->left){while(x->left) x=x->left;}print(x);//访问右孩子if(x->right){x=x->right;continue;}//回溯do{y=x;x=x->parent;//访问到根节点的父节点(NULL)if(!x) return;}while(y == x->right);}
}

转载于:https://www.cnblogs.com/blazebird/archive/2013/04/11/3015615.html

算法导论练习 10.4-5及12.1-3相关推荐

  1. 二叉树的遍历 《算法导论》10.4-1~10.4-3 10.4-5

    10.4-1 那棵树就长成下面这个样子 /*1812 107 4 2 215*/ 下面就借用10.4-1提供的数据,构建一棵树,然后分别对它做10.4-2所要求的递归遍历和10.4-3所要求的非递归遍 ...

  2. 算法导论——lec 10 图的基本算法及应用

    搜索一个图是有序地沿着图的边訪问全部定点, 图的搜索算法能够使我们发现非常多图的结构信息, 图的搜索技术是图算法邻域的核心. 一. 图的两种计算机表示 1. 邻接表: 这样的方法表示稀疏图比較简洁紧凑 ...

  3. 算法导论2nd 10.1-7

    为什么80%的码农都做不了架构师?>>>    思路:两个队列q1和q2,两个队列指针pusher和poper分别指向q1和q2,push时调用pusher->enqueue, ...

  4. 算法导论第10章习题

    10.1-1 略 10.1-2 把这个数组的头和尾各当成一个stack就好了,如果一个stack在push的过程中发现已经有值了就说明放满了. 10.1-3 略 10.1-4 ENQUE,DEQUE中 ...

  5. 算法导论 练习10.4-5二叉树的遍历

    10.4-5 给定一个n结点的二叉树,写出一个O(n)O(n)O(n)时间的非递归过程,将该树的每一个结点的关键字输出.要求除该树本身的存储空间外只能使用固定量的额外存储空间,且中过程中不得修改该树, ...

  6. 带哨兵节点的链_【算法导论】10.2不带哨兵节点和带哨兵节点的双向链表

    不带哨兵节点的双向链表即一般的双向链表,有一个头指针指向第一个节点,每个节点有key值和两个指针next和pre,分别指向前后相邻的节点,头结点的pre=NULL,尾节点的next=NULL,比较明了 ...

  7. 算法导论 练习12.1

    12.1-1 对于关键字集合{1,4,5,10,16,17,21}\{1,4,5,10,16,17,21\}{1,4,5,10,16,17,21},分别画出高度为2.3.4.5和6的二叉搜索树. 这里 ...

  8. 算法导论之贪心算法(Huffman编码和拟阵)

    贪心算法,在解决最优化问题上,通过得到子问题的局部最优解来合成问题的一个解,以局部最优选择来输出一个全局最优解. 问题要用贪心算法来求解,需满足和动态规划一样的最优子结构特征,同时还需要再每个子问题最 ...

  9. 算法导论:dfs深度优先搜索算法及基于dfs的拓扑排序以及宽度优先搜索算法bfs

    1.dfs深度优先搜索算法 算法导论中是通过三种标记颜色来介绍dfs的,white代表还没被搜过,grey代表被搜了一些,还没结束,white表示已经搜索完成的状态. c/c++复现dfs代码 #in ...

最新文章

  1. 基于python的语料库数据处理电子版_基于 Python 自然语言处理工具包在语料库研究中的运用...
  2. 博鳌直击 | 大数据开发的最大障碍是什么?
  3. 【BZOJ 4103】 [Thu Summer Camp 2015]异或运算 可持久化01Trie
  4. python定义一个整数变量_python循环定义多个变量的实例分析
  5. Asp.net MVC3.0 入门指南 6 审视编辑方法和视图
  6. html img 能显示psd吗_教育一体机迈向大尺寸化,小间距显示屏能进入教室吗?
  7. kb2919355无法安装
  8. 详解大型分布式电商系统架构
  9. eda交通灯控制器波形输入_【EDA课程设计】基于VHDL十字路口交通灯控制电路
  10. a服务器读取b服务器文件乱码,java 读取oracle中文乱码
  11. button 和 input 的submit ,reset的区别
  12. No content to map to Object due to end of input
  13. python如何调用数学函数_Python_函数调用_数学函数_组合
  14. xp系统和win7系统哪个好
  15. Loj一本通刷题记录
  16. Python-pip 安装与使用
  17. 解决Microsoft Office SDX Helper服务占用率高
  18. 编程实现:任意输入英文的月份,在查找月份表后输出其对应的中文提示。缩写也可查找。
  19. C++初阶—STL简介
  20. 【c#视频】——面向对象——多态

热门文章

  1. 标准化条件变量 -- condition_variable
  2. 整理记录word2016小技巧,自用
  3. python在for循环中不能删除正在循环的列表(问题已解决)
  4. 向顺序容器vector、string、deque、list、forward_list中插入\删除元素时迭代器、引用、指针的变化
  5. 计算机网络:05---网络类型:局域网、城域网、广域网、个域网、无线网络
  6. DialogFragment的详细讲解以及优势
  7. 计算机职称在线考试报名系统,2020年计算机职称考试网上如何报名
  8. java.awt.headless 模式(Linux, java.awt.headless and the DISPLAY environment variable)
  9. python 之 前端初识 html
  10. Vue2+VueRouter2+webpack 构建项目实战(四)接通api,先渲染个列表