树的递归实现方式很简单,下面介绍三种遍历的非递归实现。

树的遍历有个特点,那就是在处理具体问题时,绝大多数情况下是在当前循环、或函数(或是子树)的根节点来处理的,能够注意到当前根节点是如何从上个根节点得来是关键。

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();}
}

二叉树三种遍历方式的非递归实现相关推荐

  1. 剑指offer——复习1:二叉树三种遍历方式的迭代与递归实现

    剑指offer--复习1:二叉树三种遍历方式的迭代与递归实现 20180905更新:这个博客中的解法不是很好,看相应的LeetCode题目笔记~~~ 我感觉此博客中的说法更容易让人理解:https:/ ...

  2. 二叉树几种遍历算法的非递归实现

    二叉树遍历的非递归实现 相对于递归遍历二叉树,非递归遍历显得复杂了许多,但换来的好处是算法的时间效率有了提高.下面对于我学习非递归遍历二叉树算法的过程进行总结 为了便于理解,这里以下图的二叉树为例,分 ...

  3. 二叉树三种遍历方式,先序、中序、后序

    二叉树遍历方式分为三种:先序,中序和后序. 可以以根节点的位置为参考来记遍历方式,在第一个为先序,中间为中序,最后为后序: 即:先序: 根左右:中序:左根右:后序:左右根. 借个图: 之前看过一个视频 ...

  4. 二叉树的前序中序后序三种遍历方式及递归算法介绍

    二叉树三种遍历方式 二叉树的遍历是整个二叉树的核心,二叉树的几本操作都要依赖于遍历,对于二叉树的遍历,递归是最简单也最容易理解的,本文详细介绍了二叉树的三种遍历方法,并用递归来实现: 完整的可调试代码 ...

  5. 二叉树的三种遍历方式(递归、非递归和Morris遍历)

    二叉树的三种遍历方式(递归.非递归和Morris遍历) 原文:http://www.linuxidc.com/Linux/2015-08/122480.htm 二叉树遍历是二叉树的最基本的操作,其实现 ...

  6. 详解二叉树的三种遍历方式(递归、迭代、Morris算法)

    详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...

  7. c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理

    二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...

  8. 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历

    二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...

  9. c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理

    C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...

最新文章

  1. Enterprise Library 2.0 技巧(3):记录ASP.NET站点中未处理的异常
  2. 设备自动获取ip DHCP模型 IP为169.254.4.193
  3. ABAP Pattern usage - define own custom user exit
  4. 使用sql服务器发送贺卡_创建和发送免费电子贺卡的最佳网站
  5. 8.2 css3 新增标签 盒子模型 长度单位 颜色 渐变 径像渐变
  6. centos6安装mysql并远程连接_MySQL5.7数据库安装与远程连接
  7. python 当日日期_Python程序寻找当日赢家
  8. .Net Core WebApi(三)在Linux服务器上部署
  9. Ubuntu 12.04 更新重启无法进入桌面 -转
  10. 了解Objective-C中NSAutoreleasePool使用方法
  11. 内存碎片过高优化的功能和原理
  12. 高T技术大牛的百度十年:白天求生存,晚上求发展
  13. Mybatis插入大量数据效率对比:foreach插入、SqlSession批量插入、sql插入
  14. chm文件打不开的问题
  15. 【干货】JavaScript 资源大全
  16. 云计算网络,在数据中心之中主要有哪些优势?
  17. linux服务器 ip地址,查看linux服务器的IP地址
  18. Oracle数据库初学者入门教程
  19. 【烈日炎炎战后端】设计模式(1.1万字)
  20. 图论及其应用 2008年期末考试 答案 总结

热门文章

  1. 前端学习(2369):组件的创建使用和组件的生命周期
  2. 31.javaweb简介
  3. 三相电压和电流的模拟前端处理
  4. java canvas 缩放图片_详解如何用HTML5 Canvas API控制图片的缩放变换
  5. JS之返回字符首次出现位置的indexOf
  6. Nginx的应用之虚拟主机
  7. (转)深入理解Java中的final关键字
  8. linux shell的here document用法(cat EOF)
  9. angular的性能分析 -随记
  10. tomcat学习笔记——lifecycle(容器)启动都干了什么