所谓二叉树遍历是按某种特定规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树进行其它运算的基础。

二叉树的遍历有:前序/中序/后序的递归结构遍历:

1. 前序遍历(先根遍历)——访问根结点的操作发生在遍历其左右子树之前(根->左子树->右子树)。

2. 中序遍历(中根遍历)——访问根结点的操作发生在遍历其左右子树之中(左子树->根->右子树)。

3. 后序遍历(后根遍历)——访问根结点的操作发生在遍历其左右子树之后(左子树->右子树->根)。

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

以下面这个图为例,对它进行前、中、后序遍历

先动手实现如上图所示的一个二叉树

typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType _data;struct BinaryTreeNode* _left;struct BinaryTreeNode* _right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));if (newnode == NULL) {perror("BTNode::mallc");return(-1);}newnode->_data = x;newnode->_left = newnode->_right = NULL;return newnode;
}
BTNode* CreatBinaryTree()
{BTNode* A = BuyNode('A');BTNode* B = BuyNode('B');BTNode* C = BuyNode('C');BTNode* D = BuyNode('D');BTNode* E = BuyNode('E');BTNode* F = BuyNode('F');A->_left = B;A->_right = C;B->_left = D;C->_left = E;C->_right = F;return A;
}

前序遍历 

void PreOrder(BTNode* root)
{if (root == NULL) {return;}printf("%c ", root->_data);PreOrder(root->_left);PreOrder(root->_right);
}

递归调用过程如下图所示

中序遍历、后序遍历和前序遍历递归调用过程类似,就不画图了,下面分别给出了相应的代码。

 中序遍历

void InOrder(BTNode* root)
{if (root == NULL) {return;}InOrder(root->_left);printf("%c ", root->_data);InOrder(root->_right);
}

后序遍历

void PostOrder(BTNode* root)
{if (root == NULL) {return;}PostOrder(root->_left);PostOrder(root->_right);printf("%c ", root->_data);
}

前序遍历结果:A B D C E F

中序遍历结果:D B A E C F

后序遍历结果:D B E F C A

二叉树的前、中、后序遍历相关推荐

  1. 二叉树的前,中,后序遍历(思路分析) [Java][数据结构]

    二叉树的前,中,后序遍历(思路分析) 前序遍历: 先输出父节点, 再遍历左子树和右子树 中序遍历: 先遍历左子树, 再输出父节点,再遍历右子树 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点 ...

  2. Java二叉树的前中后序遍历

    Java二叉树的前中后序遍历 1.前序遍历 1.1前序遍历概念 1.2前序遍历习题 2.中序遍历 2.1中序遍历概念 2.2中序遍历习题 3.后续遍历 3.1后序遍历概念 3.2后序遍历习题 大家好, ...

  3. 数据结构之二叉树的前中后序遍历以及层序遍历

    学习目标:读完这篇博客搞定二叉树的前中后序以及层序遍历 首先:你应该明白什么是二叉树,下面这幅图就是一个完全二叉树 其实所谓的二叉树就是一个节点有小于等于二个分支的树,可以没有分支,可以有1条分支,可 ...

  4. 数据结构与算法(java):树-二叉树(二叉查找树(BST)、线索化二叉树、哈夫曼树、平衡二叉树【AVL】、二叉树的前中后序遍历)

    二叉树 1.定义 二叉树 就是度不超过2的树(每个结点最多只有两个子结点).如图 2.特殊二叉树 满二叉树 当二叉树的每一个层的结点树都达到最大值,则这个二叉树就是满二叉树. 完全二叉树 叶结点只能出 ...

  5. 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)

    文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...

  6. 二叉树的前中后序遍历(考试常考)

    二叉树遍历的概念 二叉树的遍历是按某种规则对二叉树的每个节点均只被访问一次,根据根节点访问位置的不同分为三种:先序遍历(根左右).中序遍历(左根右).后序遍历(左右根).         由于树是通过 ...

  7. 【数据结构】二叉树的前中后序遍历

    二叉树的三种遍历 1. 创建一棵简单的二叉树 1.1 二叉树结构体实现 1.2 创造一个二叉树结点的函数 1.3 手动创造一棵二叉树 2.为什么要遍历? 3.最重要的知识:由二叉树引出的子问题分析 4 ...

  8. 二叉树的前中后序遍历之迭代法(统一风格迭代方式)

    一.前序遍历(迭代法)->右左中 前序遍历是中左右,每次先处理的是中间节点,那么先将根节点放入栈中,然后将右孩子加入栈,再加入左孩子. 为什么要先加入 右孩子,再加入左孩子呢?因为这样出栈的时候 ...

  9. (必背)二叉树的前中后序遍历(利用栈)

    二叉树的前序遍历(利用栈) 1.首先将根节点压入栈 2.栈中的首元素出栈,然后先将其右节点压入栈中,再将栈中的左节点压入栈中(如果左右节点分别存在的话) 3.重复步骤2直到栈为空 class Solu ...

  10. 二叉树的前中后序遍历(栈)(C++)

    二叉树的遍历是很基础的东西,用递归是很简洁明了的写法,但是栈的写法也可以了解一下 #include<vector> #include<stack> struct TreeNod ...

最新文章

  1. GPU、FPGA芯片成为增强机器学习能力的“左膀右臂”
  2. mac安装brew(亲测有效)
  3. PHP成为首个在内核中嵌入加密库的编程语言
  4. python中常见的运行时错误_17个常见Python运行时错误
  5. ES6中的super
  6. different color in Chrome Development Tool
  7. 逻辑电平0和1的世界
  8. 【重点突破】—— React实现富文本编辑器
  9. 综合演练 对象数组 对象的方法 我们9203班 0912
  10. 【BZOJ3669】【codevs3314】魔法森林,写作LCT,读作SPFA
  11. linux 查找文件 mysql数据库_Linux下MySQL数据库目录多了好多文件
  12. FabFilter Total Bundle 2021 Mac - 经典音频效果器合集
  13. 多线程总结之旅(9):线程同步之事件
  14. java excel 导入oracle_java代码导入excel数据至oracle(poi方式)
  15. 我的电脑缩略图模式盘符名字不见了
  16. 罗技G29方向盘linux下的开发
  17. Redis深度历险——原理与集群篇
  18. 使用unity编写简单的弹幕游戏【ten seconds】
  19. 定制化件T恤其实很简单,您需要了解的有以下几点
  20. 使用大白菜装win10系统的常见问题解决方案

热门文章

  1. 给大家推荐一个用电脑拨打普通电话的软件skype
  2. linux添加删除服务
  3. MATLAB程序设计与应用刘卫国(第三版)课后实验答案——13
  4. STM32通过串口下载程序教程
  5. 基于JSP的房屋租赁系统
  6. vscode下载安装和配置使用
  7. window API播放pcm格式音频文件,函数waveOutOpen等
  8. [转帖]EventHandler部署工具
  9. 3D与2D动画哪一个更容易?
  10. Window 下载安装 Kafka