二叉树三种遍历方式的非递归实现
树的递归实现方式很简单,下面介绍三种遍历的非递归实现。
树的遍历有个特点,那就是在处理具体问题时,绝大多数情况下是在当前循环、或函数(或是子树)的根节点来处理的,能够注意到当前根节点是如何从上个根节点得来是关键。
1.先序遍历
注意栈先进后出,先压右节点。
void preOrder(node *root)
{stack<node*>sk;sk.push(root);while(!sk.empty()){node *cur = sk.top();//栈顶元素是当前的结点sk.pop();//弹出栈顶元素cout<<cur->v<<" ";//visitif(cur->rson!=NULL) sk.push(cur->rson);if(cur->lson!=NULL) sk.push(cur->lson);}
}
2.中序遍历
//m1
void Inorder(node *root)
{stack<node*>sk;while(!sk.empty() || root!=NULL){if(root == NULL){//左为空node *cur = sk.top();sk.pop();cout<<cur->v<<" ";//根遍历完root = cur->rson;//遍历右子树}else{sk.push(root);root = root->lson;//先遍历左子树}}
}//m2int kthSmallest(TreeNode* root, int k) {stack<TreeNode*> stack;while (root || stack.size() > 0) {while (root) {stack.push(root);root = root->left;}root = stack.top();stack.pop();k--;if (k == 0) {return root->val;}root = root->right;}return 0;}
3. 后序遍历:创建两个空栈,一个栈保存结点元素,一个栈保存输出的答案 根右左到左右根
void posOrder(node *root)
{stack<node*>sk; //保存结点元素stack<node*>res; //保存输出的元素sk.push(root);while(!sk.empty()){//根右左node *cur = sk.top();sk.pop();res.push(cur);if(cur->lson != NULL) sk.push(cur->lson);if(cur->rson != NULL) sk.push(cur->rson);}while(!res.empty()){//左右根cout<<res.top()->v<<" ";res.pop();}
}
二叉树三种遍历方式的非递归实现相关推荐
- 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现
剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...
- 二叉树几种遍历算法的非递归实现
二叉树遍历的非递归实现 相对于递归遍历二叉树,非递归遍历显得复杂了许多,但换来的好处是算法的时间效率有了提高.下面对于我学习非递归遍历二叉树算法的过程进行总结 为了便于理解,这里以下图的二叉树为例,分 ...
- 二叉树三种遍历方式,先序、中序、后序
二叉树遍历方式分为三种:先序,中序和后序. 可以以根节点的位置为参考来记遍历方式,在第一个为先序,中间为中序,最后为后序: 即:先序: 根左右:中序:左根右:后序:左右根. 借个图: 之前看过一个视频 ...
- 二叉树的前序中序后序三种遍历方式及递归算法介绍
二叉树三种遍历方式 二叉树的遍历是整个二叉树的核心,二叉树的几本操作都要依赖于遍历,对于二叉树的遍历,递归是最简单也最容易理解的,本文详细介绍了二叉树的三种遍历方法,并用递归来实现: 完整的可调试代码 ...
- 二叉树的三种遍历方式(递归、非递归和Morris遍历)
二叉树的三种遍历方式(递归.非递归和Morris遍历) 原文:http://www.linuxidc.com/Linux/2015-08/122480.htm 二叉树遍历是二叉树的最基本的操作,其实现 ...
- 详解二叉树的三种遍历方式(递归、迭代、Morris算法)
详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...
- c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理
二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...
- 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历
二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...
- c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理
C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...
最新文章
- Enterprise Library 2.0 技巧(3):记录ASP.NET站点中未处理的异常
- 设备自动获取ip DHCP模型 IP为169.254.4.193
- ABAP Pattern usage - define own custom user exit
- 使用sql服务器发送贺卡_创建和发送免费电子贺卡的最佳网站
- 8.2 css3 新增标签 盒子模型 长度单位 颜色 渐变 径像渐变
- centos6安装mysql并远程连接_MySQL5.7数据库安装与远程连接
- python 当日日期_Python程序寻找当日赢家
- .Net Core WebApi(三)在Linux服务器上部署
- Ubuntu 12.04 更新重启无法进入桌面 -转
- 了解Objective-C中NSAutoreleasePool使用方法
- 内存碎片过高优化的功能和原理
- 高T技术大牛的百度十年:白天求生存,晚上求发展
- Mybatis插入大量数据效率对比:foreach插入、SqlSession批量插入、sql插入
- chm文件打不开的问题
- 【干货】JavaScript 资源大全
- 云计算网络,在数据中心之中主要有哪些优势?
- linux服务器 ip地址,查看linux服务器的IP地址
- Oracle数据库初学者入门教程
- 【烈日炎炎战后端】设计模式(1.1万字)
- 图论及其应用 2008年期末考试 答案 总结