基本上所有关于二叉树的操作都是基于二叉树的遍历算法来实现的,因此在这里讲一下二叉树的遍历算法,其中包括递归与非递归算法,在算法中用输出节点数据来代替对节点的操作。
首先给出这样一棵数:

1、前序遍历
所谓前序遍历就是先对节点数据进行处理,然后才对这个节点的左右子树进行处理。对这棵二叉树的前序遍历结果为:ABDCEFG。
递归:

    void _PreOrder(PNode& pRoot){if (pRoot){cout << pRoot->_data << " ";_PreOrder(pRoot->_LChild);_PreOrder(pRoot->_RChild);}}void PreOrder(){_PreOrder(_pRoot);cout << endl;}

非递归:
非递归方式需要用到栈,这里给出两种算法:
第一种:

void PreOrder_Nor1(){if(NULL == _pRoot)return;stack<pNode> s;s.push(_pRoot);pNode pTemp = NULL;while(!s.empty()){pTemp = s.top();cout<< pTemp->_data << " ";s.pop();if(NULL != pTemp->_RChild)s.push(pTemp->_RChild);if(NULL != pTemp->_LChild)s.push(pTemp->_LChild);}cout<<endl;}

第二种:

      void PreOrder_Nor2(){if(NULL == _pRoot)return;stack<pNode> s;s.push(_pRoot);pNode cur = NULL;while(!s.empty()){cur = s.top();s.pop();while(cur){cout<< cur->_data << " ";if(cur->_RChild)s.push(cur->_RChild);cur = cur->_LChild;}}cout<<endl;}

调用三种方法:

中序遍历:
中序遍历顺序为左子树->节点->右子树,这棵二叉树的遍历结果为:BDAECFG
递归:

    void _InOrder(PNode& pRoot){if (pRoot){_InOrder(pRoot->_LChild);cout << pRoot->_data << " ";_InOrder(pRoot->_RChild);}}void InOrder(){_InOrder(_pRoot);cout << endl;}

非递归:

void InOrder_Nor()
{if(NULL == _pRoot)return;stack<pNode> s;pNode cur = _pRoot;pNode pPre = NULL;while(!s.empty() || cur){while(cur && cur != pPre){s.push(cur);cur = cur->_LChild;}if(s.empty())return;cur = s.top();cout<< cur->_data << " ";pPre = cur;s.pop();cur = cur->_RChild;}cout<<endl;
}

调用两种中序遍历算法:

后序遍历
后序遍历顺序为:左子树->右子树->节点,这棵二叉树的遍历结果为DBEGFCA
递归:

    void _PostOrder(PNode& pRoot){if (pRoot){_PostOrder(pRoot->_LChild);_PostOrder(pRoot->_RChild);cout << pRoot->_data << " ";}}void PostOrder(){_PostOrder(_pRoot);cout << endl;}

非递归:

      void PostOrder_Nor(){if(NULL == _pRoot)return;stack<pNode> s;s.push(_pRoot);pNode cur = _pRoot->_LChild;pNode pPre = NULL;while(!s.empty()){while(cur && cur!= pPre){s.push(cur);cur = cur->_LChild;}if(s.empty())return;cur = s.top();if(cur->_RChild && cur->_RChild != pPre){cur = cur->_RChild;}else{cout<< cur->_data << " ";pPre = cur;s.pop();}}cout<<endl;}

调用两种方法:

层序遍历
层序遍历算法不同于前序、中序、后序算法,层序遍历用递归方式实现比较困难,一般用队列结合循环实现比较简单。其基本思想是从根节点开始一层一层的从上向下遍历,其过程为:

因此层序遍历的结果为:ABCDEFG
其代码实现为:

    void LevelOrder(){queue<PNode> q;if (_pRoot)q.push(_pRoot);while (!q.empty()){PNode tmp = q.front();cout << tmp->_data << " ";if (tmp->_LChild)q.push(tmp->_LChild);if (tmp->_RChild)q.push(tmp->_RChild);q.pop();}cout << endl;}

遍历结果:

算法实现还有待改进,望高手斧正!

C++实现二叉树的递归遍历与非递归遍历相关推荐

  1. 漫谈二叉树遍历(非递归)

    ------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...

  2. 4.二叉树的先序、中序以及后序遍历的递归写法与非递归写法(LeetCode第94、144、145题)

    一.递归法 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是"一看就会,一写就废". 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都 ...

  3. 遍历二叉树的各种操作(非递归遍历)

    先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序.中序.后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组 ...

  4. 二叉树路径应用举例(基于非递归后序遍历)

    #include "stdafx.h" #include <iostream> #include <fstream>using namespace std; ...

  5. 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)

    1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...

  6. 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...

    树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...

  7. 二叉树前序、中序和后序遍历的非递归实现

    1 二叉树的遍历 1.1 前序遍历 对于每棵子树,先处理根,然后处理左子树,最后处理右子树.根最先访问,所以是前序遍历. 1.2 中序遍历 对于每棵子树,先处理左子树,然后处理根,最后处理右子树.根中 ...

  8. 二叉树先中后序递归遍历与非递归遍历、层次遍历

    文章目录 1 先序遍历 1.1 先序遍历递归 1.2 先序遍历非递归 2 中序遍历 2.1 中序遍历递归 2.2 中序遍历非递归 3 后序遍历 3.1 后序遍历递归 3.2 后序遍历非递归 4 层序遍 ...

  9. 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解

    前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...

  10. 二叉树的遍历(非递归)整理

    二叉树的遍历(非递归) 写在前面 二叉树重要,重要,重要.以下代码每日手撸一遍,深刻理解. 二叉树的先序遍历(非递归) 巧记心法 判断是否为空树 1.右侧入栈(访问,q指向右孩子,不空则入栈) 2.p ...

最新文章

  1. redis之父表示ARM服务器没戏
  2. 【Java 集合】Java 集合的线程安全性 ( 加锁同步 | java.utils 集合 | 集合属性 | java.util.concurrent 集合 | CopyOnWrite 机制 )
  3. OpenGL tunnel隧道的实例
  4. [html] 使用svg画出一个矩形
  5. linux查询.gz日志,linux2-查日志
  6. python-opencv学习笔记(三)
  7. 首页终于让百度放出来了
  8. 设计模式(3)--SimpleFactory( [1] 简单工厂模式)--创建型
  9. python脚本批量登录crt_python批量修改SecureCRT会话密码-阿里云开发者社区
  10. 二级专业目录计算机(软件)类,一、二级学科专业目录及名称代码表
  11. GAT1400---基于libcurl库的开发
  12. python dlib caffe人脸相似度_基于深度学习的人脸识别系统(Caffe+OpenCV+Dlib)【二】人脸预处理...
  13. 数据库服务器的安装与配置
  14. 学校计算机科室管理制度,学校科室管理制度资料.doc
  15. python字典一键多值_python一键多值
  16. VS Code加载 Web 视图时出错
  17. KEIL仿真 logic analyzer
  18. 微信支付SDK的使用
  19. civetweb学习
  20. 解决转换flash的SWF到视频文件没有声音的问题

热门文章

  1. 最完整的中国白酒知识大全,一篇文章说全中国白酒
  2. XXXXXXX-1.0-SNAPSHOT.jar 中没有主清单属性的解决办法
  3. [vuex]状态管理vuex
  4. 解决Android7.0以上读取不到本地文件的问题
  5. [Android] 能用的QQ轻聊版,3.7.1 安装后占用 36M 界面简洁,启动速度快
  6. python怎么算数据平均数,python怎样求10个数的平均数
  7. ofo打响共享单车广告战第一枪,单车大战下一步还会怎么玩?
  8. 虚拟化技术 - EXSI
  9. 【工作小tip】项目活动签到码扫码获取不到数据的bug的解决
  10. REM Backflush scrap 重复制造里 的 报废