一、概念

二叉树的遍历是指按照某种搜索方式,得到一条路径,按照这个路径访问整个二叉树,树中的每个节点访问一次。根据当前节点的访问顺序分为先序、中序、后序访问,除此之外还有一种层序,总共四种访问方式。

二、先序遍历

先序是指到达一个节点后,先输出节点所存放的数据,之后访问左子树和右子树,对应的代码如下

void preorder_print(struct TNode *t)
{if(t!=NULL){printf("%d ",t->data);preorder_print(t->left);preorder_print(t->right);}
}

三、中序遍历

中序则是到达一个节点后,先访问左子树中的节点,访问完整个左子树后,访问当前节点的数据,再进行右子树的访问,代码如下:

void midorder_print(struct TNode *t)
{if(t!=NULL){midorder_print(t->left);printf("%d ",t->data);midorder_print(t->right);}
}

四、后续遍历

后续遍历是先访问左右子树中的节点,最后访问当前节点的数据,代码如下

void postorder_print(struct TNode *t)
{if(t!=NULL){postorder_print(t->left);postorder_print(t->right);printf("%d ",t->data);}
}

五、层序遍历

层序遍历是指根据二叉树的层,从上而下,从左到右,按照这个顺序将二叉树中的节点的值输出,与层有关的问题,一般都用队列来作为辅助的存储空间,遍历时到达一个节点后,如果其有左右节点,则把左右节点入队,重复这个过程直到队列为空。代码如下

void level_print()
{queue<struct TNode *> q;struct TNode *temp=t.root; q.push(temp);int cnt=0,level=1;while(!q.empty()){struct TNode *temp;temp=q.front();q.pop();cnt++;if(temp->left!=NULL)q.push(temp->left);if(temp->right!=NULL)q.push(temp->right);printf("%d ",temp->data);if(cnt==pow(2,level)-1){printf("\n");level++;}}
}

六、总结

这几种遍历方式,除了层序需要用队列来辅助,其余三种都是直接使用递归的方式,递归好处在于代码简单,三种的区别就是访问的顺序不一样,先序输出放在最前面,中序在中间,后序则在最后面,应该将其作为模板记忆,总的思路就是如果当前节点不为空,就按照顺序要求进行访问,之后对左右子树做同样操作。涉及做题的知识在章总结里面再写。

完整版代码如下,层序建树并按照四种遍历方式全部输出

#include<bits/stdc++.h>
using namespace std;
struct Tree{struct TNode* root;int size;
};
struct Tree t;
struct TNode{int data;struct TNode *left;struct TNode *right;
};
int num[1005];
int n;
void creat()
{queue<TNode *> q;struct TNode *temp;temp=(struct TNode*)malloc(sizeof(struct TNode));temp->data=num[0];temp->left=NULL;temp->right=NULL;t.root=temp;q.push(temp);int i=1;while(i<n){temp=q.front();q.pop();struct TNode *l;l=(struct TNode*)malloc(sizeof(struct TNode));l->data=num[i];l->left=NULL;l->right=NULL;i++;temp->left=l;q.push(l);if(i==n)break;struct TNode *r;r=(struct TNode*)malloc(sizeof(struct TNode));r->data=num[i];r->left=NULL;r->right=NULL;i++;temp->right=r;q.push(r);}
}
void preorder_print(struct TNode *t)
{if(t!=NULL){printf("%d ",t->data);preorder_print(t->left);preorder_print(t->right);}
}
void midorder_print(struct TNode *t)
{if(t!=NULL){midorder_print(t->left);printf("%d ",t->data);midorder_print(t->right);}
}
void postorder_print(struct TNode *t)
{if(t!=NULL){postorder_print(t->left);postorder_print(t->right);printf("%d ",t->data);}
}
void level_print()
{queue<struct TNode *> q;struct TNode *temp=t.root; q.push(temp);int cnt=0,level=1;while(!q.empty()){struct TNode *temp;temp=q.front();q.pop();cnt++;if(temp->left!=NULL)q.push(temp->left);if(temp->right!=NULL)q.push(temp->right);printf("%d ",temp->data);if(cnt==pow(2,level)-1){printf("\n");level++;}}
}
int main()
{scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&num[i]);creat();level_print();printf("\n");preorder_print(t.root);printf("\n");midorder_print(t.root);printf("\n");postorder_print(t.root);printf("\n");return 0;
}

数据结构 5-3-1 二叉树四种顺序遍历递归实现相关推荐

  1. 数据结构与算法 | 二叉树四种的遍历方法(递归与非递归)

    二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树的所有节点,使得每个节点被访问且只访问一次. 而一般有四种遍历方法: 前序.中序.后序.层序,下面就分别讲一下四个遍历的思路以及代码实现 例如我 ...

  2. 数据结构与算法之二叉树的先序遍历,中序遍历,后序遍历

    数据结构与算法之二叉树的先序遍历,中序遍历,后移遍历 目录 实现二叉树的先序,中序,后序遍历,包括递归方式和非递归方式 在二叉树中找到一个节点的后继节点 1. 实现二叉树的先序,中序,后序遍历,包括递 ...

  3. C语言二叉树曲折级顺序遍历(附完整源码)

    C语言二叉树曲折级顺序遍历 曲折级顺序遍历 C语言二叉树曲折级顺序遍历完整源码(定义,实现,main函数测试) 曲折级顺序遍历 Given a binary Tree 1/ \2 3/ \ / \4 ...

  4. 二叉树的中序遍历 递归与非递归

    94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [ ...

  5. 二叉树的中序遍历 [递归 迭代]

    中序遍历的递归 & 迭代 前言 一.二叉树的中序遍历 二.递归 & 迭代 1.递归版 2.迭代(断左子树版) 3.迭代(root迭代版) 4.mirror(O(1)空间版) 总结 参考 ...

  6. 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)

    目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...

  7. 详细图解二叉树四种遍历(前序中序后序层次遍历)

    文章目录 一.前序遍历 常规操作 简单方法 二.中序遍历 常规操作 简单方法 三.后序遍历 常规操作 四.层次遍历 常规操作 本文中以此二叉树为例 一.前序遍历 常规操作 先根,再左,再右 确定了遍历 ...

  8. 【Java】四种方法遍历List集合元素(Iterator、ListIterator、普通for、增强for)

    首先是List集合test2的创建和元素的写入: List<String> test2 = new ArrayList<>();test2.add("1") ...

  9. 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)

    要求:以左右孩子表示法实现链式方式存储的二叉树(lson-rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...

最新文章

  1. 五个最佳案例带你解读Node.js的前后之道
  2. 1.计算机的组成(冯诺依曼体系)
  3. 利用python爬虫(part11)--XpathHelper为啥不能全信之JS要闹哪般
  4. java fx listview,JavaFX 8自定义ListView单元它是邪恶的
  5. java与sql2005连接数据库_Java链接数据库SQl Server2005
  6. Apache网站服务
  7. git小技巧之分支、关联远程仓库、回滚、解决.gitignore不生效等
  8. qt获取本机全部ipv4_Qt之获取本机网络信息(MAC, IP等等,很全)
  9. imagestring不支持中文,改用imagettftext
  10. 数据库-MySQL-数据库和表
  11. 三顺,因为你,我笑了。
  12. 图论 BZOJ 3669 [Noi2014]魔法森林
  13. ORACLE中Like与Instr模糊查询性能大比拼
  14. c语言用指针访问简单变量,关于C语言指针,个人认为最经典、最简单的一个应用...
  15. 用MACD决策树模型预测股票趋势
  16. 高手过招 放“码”出击 | 2022 Google 全球编程比赛集结倒计时!
  17. “大数据杀熟”背后的算法在为谁服务?
  18. 微信云控的大触来一下
  19. 湖南大学14届新生赛--B--bearBabylovessleeping
  20. Node.js 静态web服务

热门文章

  1. linux mail使用笔记
  2. 数据驱动测试之——CSV+TestNG
  3. Suse发生了错误Access denied for user #39;#39;@#39;localhost#39; toamp;
  4. 简单实现 C# TabControl 不显示选项卡标题
  5. 计算机电源管理设置,关于电源管理的电源管理计划设置
  6. php观察者模式使用场景,php设计模式系列--观察者模式
  7. 【技术博客】 利用Postman和Jmeter进行接口性能测试
  8. stm32端口复用和重映射
  9. Python爬虫实战---抓取图书馆借阅信息
  10. 将日期变为中文星期几