文章目录

  • 二叉树遍历非递归版本
    • 前序遍历
    • 中序遍历
    • 后序遍历
    • 层序遍历
    • 层序遍历+map记录高度

二叉树遍历非递归版本

前序遍历

如果右侧不为空,则右侧进栈,随后是左侧进栈。因为栈是先进后出,所以实现先序遍历。

void aaa2(node *head){if(head==NULL)return;stack<node> s;s.push(*head);while(!s.empty()){node a = s.top();s.pop();cout<<a.val<<" ";if(a.right!=NULL){s.push(*a.right);}if(a.left!=NULL){s.push(*a.left);}}
}

中序遍历


  1. 先把左侧全部压栈
  2. 栈中弹出并打印
  3. 右子树重复①
void bbb2(node *head){if(head==NULL)return;stack<node> s;node *cur = head;while(cur!=NULL||!s.empty()){if(cur!=NULL){s.push(*cur);cur = cur->left;}else{cur = &s.top();s.pop();cout<<cur->val<<" ";cur = cur->right;}}
}

后序遍历

#mermaid-svg-lJIb6H9QItzbUaGi {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lJIb6H9QItzbUaGi .error-icon{fill:#552222;}#mermaid-svg-lJIb6H9QItzbUaGi .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lJIb6H9QItzbUaGi .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-lJIb6H9QItzbUaGi .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lJIb6H9QItzbUaGi .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lJIb6H9QItzbUaGi .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lJIb6H9QItzbUaGi .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lJIb6H9QItzbUaGi .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lJIb6H9QItzbUaGi .marker.cross{stroke:#333333;}#mermaid-svg-lJIb6H9QItzbUaGi svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lJIb6H9QItzbUaGi .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lJIb6H9QItzbUaGi .cluster-label text{fill:#333;}#mermaid-svg-lJIb6H9QItzbUaGi .cluster-label span{color:#333;}#mermaid-svg-lJIb6H9QItzbUaGi .label text,#mermaid-svg-lJIb6H9QItzbUaGi span{fill:#333;color:#333;}#mermaid-svg-lJIb6H9QItzbUaGi .node rect,#mermaid-svg-lJIb6H9QItzbUaGi .node circle,#mermaid-svg-lJIb6H9QItzbUaGi .node ellipse,#mermaid-svg-lJIb6H9QItzbUaGi .node polygon,#mermaid-svg-lJIb6H9QItzbUaGi .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lJIb6H9QItzbUaGi .node .label{text-align:center;}#mermaid-svg-lJIb6H9QItzbUaGi .node.clickable{cursor:pointer;}#mermaid-svg-lJIb6H9QItzbUaGi .arrowheadPath{fill:#333333;}#mermaid-svg-lJIb6H9QItzbUaGi .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lJIb6H9QItzbUaGi .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lJIb6H9QItzbUaGi .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-lJIb6H9QItzbUaGi .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-lJIb6H9QItzbUaGi .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lJIb6H9QItzbUaGi .cluster text{fill:#333;}#mermaid-svg-lJIb6H9QItzbUaGi .cluster span{color:#333;}#mermaid-svg-lJIb6H9QItzbUaGi div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lJIb6H9QItzbUaGi :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

后序
中右左进栈
输出

  1. 先左边进栈 再右边进栈
  2. 此时输出的顺序为 中右左
  3. 不输出,再进栈,之后输出,顺序为左中右
void ccc2(node *head){if(head==NULL)return;stack<node> s1;stack<node> s2;s1.push(*head);node top;while(!s1.empty()){top = s1.top();s1.pop();s2.push(top);if(top.left!=NULL){s1.push(*top.left);}if(top.right!=NULL){s1.push(*top.right);}}while(!s2.empty()){top = s2.top();s2.pop();cout<<top.val<<" ";}
}

层序遍历


  1. 头节点入栈
  2. pop()并输出栈顶
  3. 先左后右
void ddd1(node *head){if(head==NULL)return;queue<node> q1;q1.push(*head);while(!q1.empty()){node top = q1.front();q1.pop();cout<<top.val<<" ";if(top.left!=NULL){q1.push(*top.left);}if(top.right!=NULL){q1.push(*top.right);}}
}

层序遍历+map记录高度

map<node*,int> 用来记录结点对应的高度

void ddd2(node *head){if(head==NULL)return;queue<node*> q1;map<node*, int> maps;q1.push(head);maps[head] = 1;while(!q1.empty()){node* top = q1.front();q1.pop();int level = maps[top];cout<<"数值:"<<top->val<<",层数:"<<level<<endl;if(top->left!=NULL){q1.push(top->left);maps[top->left] = level+1; }if(top->right!=NULL){q1.push(top->right);maps[top->right] = level+1;}}
}

二叉树遍历(非递归)相关推荐

  1. 刷题:二叉树的非递归遍历方式

    二叉树的非递归的遍历方式 上篇博客记录了二叉树的递归遍历方式以及根据二叉树的遍历结果还原二叉树的内容. 本篇博客记录二叉树的非递归的遍历方式. 二叉树的非递归遍历需要借助栈来实现,而且三种遍历的方式的 ...

  2. 二叉树的非递归遍历(c/c++)

    由于递归算法相对于非递归算法来说效率通常都会更低,递归算法会有更多的资源需要压栈和出栈操作(不仅仅是参数,还有函数地址等)由于编译器对附加的一些栈保护机制会导致递归执行的更加低效,使用循环代替递归算法 ...

  3. 创建的二叉树后续非递归遍历结果为_一入递归深似海,从此offer是路人

    前言 今天我们来总结二叉树的前中后序以及层次遍历的递归与非递归的写法.我们都知道二叉树遍历的递归写法很简单,但是面试的时候面试官往往考察的不是我们递归的写法,他们满怀期待你写出非递归的解法,而当你只会 ...

  4. 二叉树的非递归遍历(统一的模板)

    二叉树的非递归遍历 前言 树的存储结构 先序遍历 先序的递归遍历 先序的非递归遍历 中序遍历 中序的递归遍历 中序遍历的非递归算法 后序遍历 后序的递归遍历 后序的非递归遍历 层次遍历 层次遍历获得每 ...

  5. 数据结构-二叉树的非递归遍历

    前面的章节我们实现了二叉树最基本的遍历方式:递归遍历,代码是如此的简洁:辣么我们为什么还要去学习二叉树的非递归遍历方式呢?众所周知,递归优点是将可以将复杂的问题简单化即大问题拆分成一个个小问题,那么它 ...

  6. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  7. 二叉树前序、中序、后序遍历非递归写法的透彻解析

    前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历.递归写法,只要理解思想,几行代码.可是非递归写法却很不容易.这里特地总结下,透彻解析它们的非递归写法.其中,中序遍历的非递归写法最简 ...

  8. 树:二叉树的非递归遍历算法

    二叉树的递归遍历 二叉树的递归遍历算法,写法很简单,比如说前序遍历树,如下: //前序遍历 void PreOrderTraverse(BiTree tree) {if (NULL != tree){ ...

  9. 6-9 二叉树的非递归遍历 (20 分)

    ** 6-9 二叉树的非递归遍历 (20 分) ** 本题要求用非递归的方法实现对给定二叉树的 3 种遍历. 函数接口定义: void InorderTraversal( BinTree BT ); ...

  10. 二叉树后序遍历_二叉树后序遍历非递归实现

    二叉树的后序遍历非递归实现是三种遍历实现里面最复杂的一种了. 后序遍历的顺序是左节点-右节点-根节点,因为二叉树每个节点只有指向子节点的指针而没有指向父节点的指针,因此我们需要一个额外的变量来记录是否 ...

最新文章

  1. delphi 保存数据到sql_介绍一款免费好用的可视化数据库管理工具
  2. 盘点2021:数据中心行业迎来转折点
  3. VTK:Filtering之IterativeClosestPointsTransform
  4. 让一个python源文件也能像bat批处理文件那样运行[转]
  5. python爬虫怎么下载图片到手机_Python爬虫获取图片并下载保存至本地
  6. webloigc12服务启动不了_weblogic启动不能锁定AdminServer.lok的故障处理
  7. ionic4请求skynet服务器的资源跨域问题
  8. oracle第三天笔记
  9. 比PS更简单好用的自动抠图软件 一键抠图工具
  10. rls自适应滤波器matlab实现,rls算法的自适应滤波器matlab仿真作业.doc
  11. 软件工程——软件开发过程中用到的各种图
  12. 数据可视化——tableau 数据报表样例(报表模板)
  13. storm 阿姆歌曲_Eminem经典歌词
  14. 广义线性模型(GLM)初级教程
  15. CPU虚拟化技术及QEMU/KVM虚拟机安装实践
  16. 电车要迎来大爆发?华州电车的额外补贴要来了
  17. 【中亦安图】关于数据库文件损坏风险的提醒(3)
  18. 团队合作难,归根到底是老板领导力不行
  19. sublimelinter php,sublime text 3 在Windows下配置sublimelinter-php的路径问题
  20. 如果redis没有设置expire,是否默认永不过期?

热门文章

  1. 半双工通信模块碰撞问题
  2. android网购功能,网购Android App购物车点击动画实现详解
  3. charles证书信任设置
  4. AJAX请求和普通HTTP请求区别(postman分析)
  5. 怎样利用开源软件赚钱?
  6. RT-Thread使用DP83640 实现IEEE1588 协议笔记
  7. 本周运气大爆发~希望不会把自己的好运都用光了……
  8. 【CSDN英雄会】囯炬CEO张代浩:做写架构的人,做制定游戏规则的人
  9. vue 可用的 ui_ui设计的10种可用性启发法
  10. Echarts(三):含有时间轴的可视化案例1