二叉树的遍历

所谓二叉树的遍历,是指按某条搜索路径访问树中的每个节点,使得每个节点均被访问一次,而且仅被访问一次。

遍历二叉树需要决定对根节点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.

这是二叉树结点的递归遍历,实现起来比较简单,很好地使用了递归的思想。

二叉树的非递归遍历在我的另一边文章当中

连接如下:二叉树的非递归遍历

最后,送大家一句话:知识并不能为我们带来财富,但是能使我们有能力去创造财富。

详解二叉树的递归遍历与非递归遍历相关推荐

  1. 二叉树遍历详解(递归遍历、非递归栈遍历,Morris遍历)

    一.前言 <二叉查找树全面详细介绍>中讲解了二叉树操作:搜索(查找).遍历.插入.删除.其中遍历深度优先遍历(DFS)按照实现方法可以分为:递归遍历实现.非递归遍历实现.Morris遍历实 ...

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

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

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

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

  4. 二叉树创建,递归遍历,非递归遍历

    二叉树 博主是一个大一刚刚放暑假的大学生,大学我们只学习了c语言,现在这么卷只学c语言肯定不够,所以博主打算从零开始恶补c++顺便写文章记录一下,另外博主这个暑假还想记录一些算法基础内容欢迎关注哦.这 ...

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 按计算机的地位划分计算机网络可分为,2010年全国自考计算机网络基本原理模拟试卷(三)及答案...
  2. java robot 对象_用Java Robot对象实现服务器屏幕远程监视
  3. Linq 常用操作(增删改)
  4. 两个队列实现一个栈思路c语言,两个栈实现队列功能C语言实现能运行!
  5. 我要回家软件_工具用的好,下班回家早,推荐几个堪称神器的高效率软件
  6. Eclipse开发常用快捷键
  7. 错误解决办法:_ZNSaIcED1Ev@@GLIBCXX_3.4
  8. 通达OA与触点通RTC的集成插件
  9. js校验统一社会信用代码的合法性GB 32100-2015
  10. 使用python建立n维0矩阵
  11. changelog 生成  npm install -g conventional-changelog-cli
  12. contest 12.31
  13. 受汉城改名鼓舞,世界各地掀起改名热潮,尤其是那个小日本(笑话)
  14. python爬取王者_Python爬取王者荣耀英雄图片及装备!你玩吗?
  15. PAT 1002 写出这个数 (20分)(Java)
  16. LeetCode 9. 回文数 Palindrome Number
  17. corex9服务器组装攻略,ROG M7H+ GTX980+Tt Core X9怪兽级主机攒机记
  18. 8支团队正在努力构建下一代区块链以太坊Ethereum 2.0
  19. Linux单机运行vasp,VASP单机编译
  20. 南京邮电大学网络攻防训练平台writeup

热门文章

  1. 计算机网络 —— 冲突域和广播域
  2. 用计算机算重积分,北京邮电大学计算机学院高等数学重积分的计算.ppt
  3. FFmpeg 以及帧率的解释
  4. 计算机上未检测到u盾,u盾检测不到-电脑上检测不到我的U盾怎么办? 爱问知识人...
  5. tpac100控制器设置教程_ac100控制器设置方法
  6. qqxml图片代码_QQXML代码大全(持续更新)
  7. 理正深基坑弹性计算方法_【干货】关于深基坑计算的几点思考(一个实际项目的总结)...
  8. Java订单接入支付宝二 支付回调
  9. .net DLL反编译文件
  10. mybatis传递pojo类学习