//! 前序遍历的非递归版本,精髓在于用栈模拟递归的过程,但实际进栈出栈顺序与递归并不一样,
//! 比较抽象,建议画图理解,比较重要
void BinarySearchTreesZH::preorderTraversalNoRecursion(Node *node)
{stack<Node *> stk;if (node == nullptr){return;}stk.push(node);while (stk.size() != 0){Node *top = stk.top();cout << stk.top()->element << " ";stk.pop();//! 注意前序遍历是中左右,出栈顺序是先左后右,进栈就要先右后左if (top->right != nullptr){stk.push(top->right);}if (top->left != nullptr){stk.push(top->left);}}
}//! 中序遍历,非递归版,跟上一个前序遍历的非递归版比,思路相同,但是实现方法和过程完全不同
//! 比较抽象,依然建议画图理解
//! 巧妙地改变了入栈顺序实现了中序遍历
void BinarySearchTreesZH::inorderTraversalNoRecursion(Node *node)
{if (node == nullptr){return;}stack<Node *> stk;stk.push(node);while (stk.size() != 0){while (node->left != nullptr){stk.push(node->left);node = node->left;}//! 整体思路为遇到根节点,就遍历左子树的所有左节点,并全部入栈,然后挨个出栈,//! 出栈中检测是否有右节点,如果有则以右节点为根结点,再次遍历全部左结点,全部入栈,然后挨个出栈Node *top = stk.top();cout << top->element << " ";stk.pop();if (top->right != nullptr){node = top->right;stk.push(top->right);}}
}//! 后序遍历,非递归版,可以通过改变前序遍历非递归版中左右结点的入栈顺序,和翻转数组的想法实现
void BinarySearchTreesZH::postorderTraversalNoRecursion(Node *node)
{if (node == nullptr){return;}string s = " ";stack<Node *> stk;stk.push(node);Node *top = stk.top();while (stk.size() != 0){top = stk.top();stk.pop();s = s + to_string(top->element) + " ";if (top->left != nullptr){ //! 整体思路和前序遍历相同,入栈顺序自己想想前序中左右,和后序左右中,就明白了stk.push(top->left);}if (top->right != nullptr){stk.push(top->right);}}reverse(s.begin(), s.end()); //reverse函数反转字符串cout << s;
}

2021 - 10 -7 ! 二叉树的前序、中序、后序遍历 非递归思路(迭代版本)相关推荐

  1. C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本

    本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...

  2. java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...

    224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...

  3. 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】

    1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...

  4. java数据结构学习笔记-二叉树前、中、后序遍历

    public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...

  5. 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】

    1.前序遍历 #include <iostream> #include <vector> #include <queue> #include <algorit ...

  6. 二叉树前、中、后序线索化及遍历

    public class ThreadedBinaryTree {public static void main(String[] args){Heronodes node1=new Heronode ...

  7. 二叉树的前、中、后、层次非递归遍历(js)

    有如下二叉树  遍历: // 前序遍历, head-left-rightfunction HLR (tree) {const stack = [], res = []if (tree) stack.p ...

  8. 二叉树的先序/中序/后序/层次遍历

    [简介] 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用. 二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和&quo ...

  9. 用前序中序创建二叉树(用中序后序创建二叉树)

    定义二叉树结点 比如就拿这个二叉树 前序中序创建 因为前序遍历的顺序是 根 , 左 ,右. 中序的遍历是 左 根 右. 我们会很不好想,但我们可以用前序和中序把上面那个二叉树的遍历一边 前序遍历:AB ...

最新文章

  1. openssl生成https证书
  2. spring第一个小例子(Spring_xjs1)
  3. Android style 继承
  4. 薇娅夫妇合伙企业正式注销 系决议解散
  5. ctf里的拼图工具_CTF比赛工具pwntools介绍
  6. 【linux基础】16、软件包管理
  7. 微信团队回应“部分用户朋友圈无法刷新”;罗永浩:准备做综艺节目;Apache Spark 3.0 发布| 极客头条...
  8. 5.2 - Function Basics
  9. Unity3D之NGUI基础6:UIButton按钮
  10. 将客户端将IE9强制为IE7
  11. Linux网络编程---htons函数的使用
  12. 博客linux系统下载器,linux的下载工具
  13. char*赋值给std::string是深拷贝
  14. Step 1: 盲打第三天
  15. vscode背景的更换_vscode背景图怎么换
  16. mediawiki php7,centos7搭建mediawiki
  17. dxf制作kml_kml到dxf
  18. 【Unity 框架】QFramework v1.0 使用指南 架构篇:05. 引入 Utility | Unity 游戏框架 | Unity 游戏开发 | Unity 独立游戏
  19. 洛谷 P1357 花园
  20. 【Lesson 1】 和弦 Chord

热门文章

  1. 最优化算法python实现篇(3)——无约束一维极值(黄金分割法)
  2. mysql空洞_optimize table 删除空洞--MYSQL
  3. 趣链 BitXHub跨链平台 (7)应用链插件
  4. 【数据库复习】第一章绪论
  5. [Issue Fixed]-Pulse r9.1 embedded browser install failure
  6. Globalplatform TEE api介绍
  7. [core]-ARM A76学习笔记
  8. 基于移位寄存器的序列密码
  9. 编写 matlab怎么调用 8 点和 16 点的 fft,8点基于DIT的FFT的实现
  10. android 修改toolbar菜单item的icon图标