详解二叉树的递归遍历与非递归遍历
二叉树的遍历
所谓二叉树的遍历,是指按某条搜索路径访问树中的每个节点,使得每个节点均被访问一次,而且仅被访问一次。
遍历二叉树需要决定对根节点N、左子树L、右子树R的访问顺序(按照先遍历左子树在遍历右子树的原则),常见的遍历次序有先序(NLR)、中序(LNR)、后序(LRN)三种遍历算法,这也是最常见的二叉树遍历算法。
其中的“序”实际上就是根节点的访问时机。
1. 二叉树的数据结构
typedef struct BTNode{
int data; //保存节点中的值
struct BTNode *lchild; //左孩子指针
struct BTNode *rchild; //右孩子指针
}BTNode,*BiTree;
这里我使用的比较适合基础学者的二叉树的存储结构,不同的存储结构,实现二叉树操作的算法也会不同,因此要根据实际应用场合(树的形态和需要进行的运算)来选择合适的存储结构。
不说废话了,哈哈肯定把你急死了!
2.二叉树的递归遍历
1. 先序遍历
先序遍历(PreOrder)的操作如下:
①首先若二叉树为空,则什么也不做;否则,
- 访问根节点;
- 先序遍历左子树;
- 先序遍历右子树。
对应的递归算法如下:
void PreOrder(BiTree T){if(T!=NULL){visit(T); //访问跟结点PreOrder(T->lchild); //访问左子树PreOrder(T->rchild); //访问右子树}
}
这里举一个例子做说明吧(后面都是使用这个例子),例子二叉树如下:
这样一来先序遍历所得到的节点序列为1 2 4 6 3 5.
2. 中序遍历
中序遍历(InOrder)的操作如下:
①首先若二叉树为空,则什么也不做;否则,
- 中序遍历左子树;
- 访问根节点;
- 中序遍历右子树。
对应的递归算法如下:
void InOrder(BiTree T){if(T!=NULL){InOrder(T->lchild);//递归遍历左子树visit(T);//访问根结点InOrder(T->lchild);//递归遍历右子树}
}
这样一来中序遍历所得到的节点序列为2 6 4 1 3 5.
3. 后序遍历
后序遍历(PostOrder)的操作如下:
①首先若二叉树为空,则什么也不做;否则,
- 后序遍历左子树;
- 后序遍历右子树;
- 访问根节点。
对应的递归算法如下:
void PostOrder(BiTree T){if(T!=NULL){PostOrder(T->lchild);//递归遍历左子树PostOrder(T->rchild);//递归遍历左子树visit(T); //访问根结点}
}
这样一来后序遍历所得到的节点序列为6 4 2 5 3 1.
这是二叉树结点的递归遍历,实现起来比较简单,很好地使用了递归的思想。
二叉树的非递归遍历在我的另一边文章当中
连接如下:二叉树的非递归遍历
最后,送大家一句话:知识并不能为我们带来财富,但是能使我们有能力去创造财富。
详解二叉树的递归遍历与非递归遍历相关推荐
- 二叉树遍历详解(递归遍历、非递归栈遍历,Morris遍历)
一.前言 <二叉查找树全面详细介绍>中讲解了二叉树操作:搜索(查找).遍历.插入.删除.其中遍历深度优先遍历(DFS)按照实现方法可以分为:递归遍历实现.非递归遍历实现.Morris遍历实 ...
- 二叉树前中后序遍历的非递归实现以及层次遍历、zig-zag型遍历详解
前言 二叉树的遍历是一个比较常见的问题,递归实现二叉树的前中后序遍历比较简单,但非递归实现二叉树的前中后序遍历相对有难度.这篇博客将详述如何使用非递归的方式实现二叉树的前中后序遍历,在进行理论描述的同 ...
- 详解二叉树的三种遍历方式(递归、迭代、Morris算法)
详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...
- 二叉树创建,递归遍历,非递归遍历
二叉树 博主是一个大一刚刚放暑假的大学生,大学我们只学习了c语言,现在这么卷只学c语言肯定不够,所以博主打算从零开始恶补c++顺便写文章记录一下,另外博主这个暑假还想记录一些算法基础内容欢迎关注哦.这 ...
- 漫谈二叉树遍历(非递归)
------这篇文章旨在提出一种简单方便,易于理解时空复杂度低且风格统一的二叉树非递归遍历方法. 从二叉树先序遍历开始 二叉树的先序遍历(非递归)相比中后序是最少花哨.最统一的.一般来说先序遍历的代码 ...
- 4.二叉树的先序、中序以及后序遍历的递归写法与非递归写法(LeetCode第94、144、145题)
一.递归法 这次我们要好好谈一谈递归,为什么很多同学看递归算法都是"一看就会,一写就废". 主要是对递归不成体系,没有方法论,每次写递归算法 ,都是靠玄学来写代码,代码能不能编过都 ...
- 遍历二叉树的各种操作(非递归遍历)
先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序.中序.后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组 ...
- 二叉树路径应用举例(基于非递归后序遍历)
#include "stdafx.h" #include <iostream> #include <fstream>using namespace std; ...
- 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)
1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...
- 信号放大器数据结构_[11/11]数据结构 二叉树应用(树型信号放大器,file transfer,遍历的非递归实现)...
树型分布网络信号放大器 森林和二叉树的相互转换 并查集 例题:File transfer #include <iostream> using namespace std; //typede ...
最新文章
- 按计算机的地位划分计算机网络可分为,2010年全国自考计算机网络基本原理模拟试卷(三)及答案...
- java robot 对象_用Java Robot对象实现服务器屏幕远程监视
- Linq 常用操作(增删改)
- 两个队列实现一个栈思路c语言,两个栈实现队列功能C语言实现能运行!
- 我要回家软件_工具用的好,下班回家早,推荐几个堪称神器的高效率软件
- Eclipse开发常用快捷键
- 错误解决办法:_ZNSaIcED1Ev@@GLIBCXX_3.4
- 通达OA与触点通RTC的集成插件
- js校验统一社会信用代码的合法性GB 32100-2015
- 使用python建立n维0矩阵
- changelog 生成 npm install -g conventional-changelog-cli
- contest 12.31
- 受汉城改名鼓舞,世界各地掀起改名热潮,尤其是那个小日本(笑话)
- python爬取王者_Python爬取王者荣耀英雄图片及装备!你玩吗?
- PAT 1002 写出这个数 (20分)(Java)
- LeetCode 9. 回文数 Palindrome Number
- corex9服务器组装攻略,ROG M7H+ GTX980+Tt Core X9怪兽级主机攒机记
- 8支团队正在努力构建下一代区块链以太坊Ethereum 2.0
- Linux单机运行vasp,VASP单机编译
- 南京邮电大学网络攻防训练平台writeup
热门文章
- 计算机网络 —— 冲突域和广播域
- 用计算机算重积分,北京邮电大学计算机学院高等数学重积分的计算.ppt
- FFmpeg 以及帧率的解释
- 计算机上未检测到u盾,u盾检测不到-电脑上检测不到我的U盾怎么办? 爱问知识人...
- tpac100控制器设置教程_ac100控制器设置方法
- qqxml图片代码_QQXML代码大全(持续更新)
- 理正深基坑弹性计算方法_【干货】关于深基坑计算的几点思考(一个实际项目的总结)...
- Java订单接入支付宝二 支付回调
- .net DLL反编译文件
- mybatis传递pojo类学习