二叉树----数据结构:二叉树的三种遍历,利用递归算法。

关于二叉树的遍历,应用非常广泛,不单单是访问打印结点,还可以进行一系列的操作,如赋值、删除、查找、求二叉树的深度等等。

有递归和非递归两种算法,非递归用到了栈和队列结构,比较繁琐,在此推荐用递归算法。下面给出完整代码。

#define CHAR /* 字符型 *//* #define INT /* 整型(二者选一) */#include<string.h>#include<ctype.h>#include<malloc.h> /* malloc()等 */#include<limits.h> /* INT_MAX等 */#include<stdio.h> /* EOF(=^Z或F6),NULL */#include<stdlib.h> /* atoi() */#include<io.h> /* eof() */#include<math.h> /* floor(),ceil(),abs() */#include<process.h> /* exit() *//* 函数结果状态代码 */#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */#ifdef CHARtypedef char TElemType;TElemType Nil=' '; /* 字符型以空格符为空 */#endif#ifdef INTtypedef int TElemType;TElemType Nil=0; /* 整型以0为空 */#endif/* c6-2.h 二叉树的二叉链表存储表示 */typedef struct BiTNode{TElemType data;struct BiTNode *lchild,*rchild; /* 左右孩子指针 */}BiTNode,*BiTree;Status InitBiTree(BiTree *T){ /* 操作结果: 构造空二叉树T */*T=NULL;return OK;}void CreateBiTree(BiTree *T){ /* 算法6.4:按先序次序输入二叉树中结点的值(可为字符型或整型,在主程中 *//* 定义),构造二叉链表表示的二叉树T。变量Nil表示空(子)树。有改动 */TElemType ch;#ifdef CHARscanf("%c",&ch);#endif#ifdef INTscanf("%d",&ch);#endifif(ch==Nil) /* 空 */*T=NULL;else{*T=(BiTree)malloc(sizeof(BiTNode));if(!*T)exit(OVERFLOW);(*T)->data=ch; /* 生成根结点 */CreateBiTree(&(*T)->lchild); /* 构造左子树 */CreateBiTree(&(*T)->rchild); /* 构造右子树 */}}Status BiTreeEmpty(BiTree T){ /* 初始条件: 二叉树T存在 *//* 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE */if(T)return FALSE;elsereturn TRUE;}#define ClearBiTree DestroyBiTreeint BiTreeDepth(BiTree T){ /* 初始条件: 二叉树T存在。操作结果: 返回T的深度 */int i,j;if(!T)return 0;if(T->lchild)i=BiTreeDepth(T->lchild);elsei=0;if(T->rchild)j=BiTreeDepth(T->rchild);elsej=0;return i>j?i+1:j+1;}TElemType Root(BiTree T){ /* 初始条件: 二叉树T存在。操作结果: 返回T的根 */if(BiTreeEmpty(T))return Nil;elsereturn T->data;}void PreOrderTraverse(BiTree T,Status(*Visit)(TElemType)){ /* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数。算法6.1,有改动 *//* 操作结果: 先序递归遍历T,对每个结点调用函数Visit一次且仅一次 */if(T) /* T不空 */{Visit(T->data); /* 先访问根结点 */PreOrderTraverse(T->lchild,Visit); /* 再先序遍历左子树 */PreOrderTraverse(T->rchild,Visit); /* 最后先序遍历右子树 */}}void InOrderTraverse(BiTree T,Status(*Visit)(TElemType)){ /* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 *//* 操作结果: 中序递归遍历T,对每个结点调用函数Visit一次且仅一次 */if(T){InOrderTraverse(T->lchild,Visit); /* 先中序遍历左子树 */Visit(T->data); /* 再访问根结点 */InOrderTraverse(T->rchild,Visit); /* 最后中序遍历右子树 */}}void PostOrderTraverse(BiTree T,Status(*Visit)(TElemType)){ /* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 *//* 操作结果: 后序递归遍历T,对每个结点调用函数Visit一次且仅一次 */if(T) /* T不空 */{PostOrderTraverse(T->lchild,Visit); /* 先后序遍历左子树 */PostOrderTraverse(T->rchild,Visit); /* 再后序遍历右子树 */Visit(T->data); /* 最后访问根结点 */}}Status visitT(TElemType e){#ifdef CHARprintf("%c ",e);#endif#ifdef INTprintf("%d ",e);#endifreturn OK;}void main(){int i;BiTree T,p,c;TElemType e1,e2;InitBiTree(&T);printf("构造空二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));e1=Root(T);if(e1!=Nil)#ifdef CHARprintf("二叉树的根为: %c\n",e1);#endif#ifdef INTprintf("二叉树的根为: %d\n",e1);#endifelseprintf("树空,无根\n");#ifdef CHARprintf("请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)\n");#endif#ifdef INTprintf("请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树)\n");#endifCreateBiTree(&T);printf("建立二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T));e1=Root(T);if(e1!=Nil)#ifdef CHARprintf("二叉树的根为: %c\n",e1);#endif#ifdef INTprintf("二叉树的根为: %d\n",e1);#endifelseprintf("树空,无根\n");printf("先序递归遍历二叉树:\n");PreOrderTraverse(T,visitT);printf("\n");printf("中序递归遍历二叉树:\n");InOrderTraverse(T,visitT);printf("\n");printf("后序递归遍历二叉树:\n");PostOrderTraverse(T,visitT);}

关于二叉树遍历的题目:

注意:已知两种遍历,必须有中序遍历才能找到原来的二叉树序列。

先序序列确定根结点,中序序列确定左右孩子,后序序列确定根结点,确定根结点后再看中序序列根结点的位置,如果根结点左右有结点说明有孩子,再看孩子在先序中的先后位置,结点在前,孩子在后,依次类推。

欢迎您关注,了解更多请浏览本人其他博文。

二叉树----数据结构:二叉树的三种遍历及习题相关推荐

  1. 二叉树的建立和三种遍历

    二叉树的三种遍历是以根的遍历顺序来讲的 先序遍历(根左右) 中序遍历(左根右) 后序遍历(左右根) 二叉树是从根节点的那一层开始,从左至右读每一层的结点读入的.@表示空结点,#表示输入结束 #incl ...

  2. 二叉树的创建与三种遍历方式(带图文详解)

    二叉树是由多节点组成的,每个节点最多链接两个节点,这两个节点就称为根节点的左树和右树. 每个节点的由数据区,左树,右树组成. typedef struct node {int data;struct ...

  3. 20-12-22 二叉树的构建、三种遍历、顺序二叉树原理

    二叉树: public class BinaryTree {public static void main(String[] args) {HeroNode heroNode1 = new HeroN ...

  4. 二叉树的建立与三种遍历

    树是一种数据结构,为什么叫它"树",因为它倒过来就是一棵树 根在上,而叶在下 其概念主要有根.父.子.深.叶等, 如上图:A为这棵树的根 B为D的父,而D则为B的子 E.F.G互为 ...

  5. 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现

    读完本文你将了解到: 什么是二叉树 Binary Tree 两种特殊的二叉树 满二叉树 完全二叉树 满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二叉树节点 ...

  6. C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)

    关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质 二叉树的基本性质 1)二叉树的第i层上至多有 2^(i-1)(i ≥1)个结点: 2)深度为 h 的二叉树中至多含有 2^h – ...

  7. 【数据结构】理解二叉树的三种遍历--前序、中序、后序 +层序(简明易懂)

    一.易懂的形象理解 其实从名字就可以很好的理解这三种遍历,我在第二点时候说,但是估计能翻到我的文的同学们之前肯定看过好多类似的了,那咱们换个思路~ 先用我想的一种简单易懂的形象思维理解一下前序.中序. ...

  8. python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)

    树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...

  9. 二叉树的三种遍历(递归与非递归) + 层次遍历

    <转载于  >>> > 二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的.二叉树有前.中.后三种遍历方式,因为树的本身就是用递归定义的,因此 ...

最新文章

  1. JavaScript奇技淫巧44招(2)
  2. shell之实战应用一(查找xml文档中的关键字段)
  3. Python进阶08 异常处理
  4. 帝国cms调用栏目自定义字段(栏目简介)如何操作
  5. shell printf命令:格式化输出语句
  6. shell脚本详解(六)——数组简介和排序算法
  7. (王道408考研操作系统)第三章内存管理-第一节6-4:非连续分配管理方式之基本分页存储管理之两级页表
  8. HDU 2328 Corporate Identity
  9. 这次,甘肃的老百姓办理就医再也不用等了
  10. MacOS如何修复磁盘权限
  11. mysql引擎接口_Mysql存储引擎MyISAM和InnoDB
  12. 好用的屏幕录像截图工具:Movavi Screen Capture Pro 10 Mac
  13. kindle看pdf不清楚_无法在Kindle上阅读PDF格式的电子书,该怎么办呢?
  14. 熵增定律:企业和个人发展的终极规律
  15. 【真北读书】弗兰克意义三途径,让你人生的意义不漂移
  16. 【大咖分享】BFF在千寻位置网前端的落地和演进
  17. 自动化测试、自动化测试框架和云测试相关论文列表
  18. Java 8 新特性
  19. 通过eclipse手工生成osgi-bundle的jar包
  20. Flink大数据实时计算系列-Flink的Operator Chains的优化机制

热门文章

  1. 怎么把一个bool数组转成char?
  2. Linux 开发者最应该知道的命令汇总
  3. 微电子科学与工程要学计算机吗,微电子科学与工程专业就业前景如何 有前途吗...
  4. 二叉树小球下落问题c语言,#C++初学记录(树和二叉树)
  5. 攻防比赛_2020年度泉州市大学生网络安全攻防比赛在黎明职业大学圆满落幕
  6. Struts2_2_解决配置文件冗余_动作类对象数据封装_数据类型转换_表单数据信息提示
  7. LeetCode 2001. 可互换矩形的组数
  8. LeetCode 1722. 执行交换操作后的最小汉明距离(并查集)
  9. LeetCode 484. 寻找排列(找规律+贪心)
  10. LeetCode 96. 不同的二叉搜索树(DP)