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

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

 

 

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

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

 


 

#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);}


 

 

关于二叉树遍历的题目:

 

 

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/482124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌硬件主管:AR眼镜还在开发,环境计算是未来目标

来源&#xff1a;网易智能5月13日消息&#xff0c;谷歌硬件主管里克奥斯特洛 (Rick Osterloh)日前在接受采访时表示&#xff0c;“环境计算”是谷歌未来的目标和愿景。奥斯特洛周三在接受采访时表示&#xff1a;“计算应该能够无缝帮助你解决任何问题&#xff0c;而且就在你身边…

大脑衰老可逆转,只需注入年轻脑脊液,「返老还童」登Nature

来源&#xff1a;FUTURE远见 选编&#xff1a;闵青云 「老喽&#xff0c;记不住喽。」随着年龄的不断增长&#xff0c;不少人都会发出这样的感叹——记忆力逐渐下降。那么是否存在一种方法&#xff0c;可以让这种自然现象「逆天改命」呢&#xff1f;Nature说&#xff1a;有的。…

人工智能在苍蝇眼的帮助下监测无人机:新的仿生算法从噪声中提取信号

来源&#xff1a;国际仿生工程学会2018年12月&#xff0c;由于有报道称附近有无人机飞行&#xff0c;数千名度假旅客被困在伦敦盖特威克机场。导致这个欧洲非常繁忙的机场关闭了两天&#xff0c;造成重大延误&#xff0c;并使航空公司损失了数百万美元。商业空域中未经授权的无…

树的知识点总结-数据结构

** 一&#xff1a;树的基本术语 1.定义 树是一种非线性结构&#xff0c;只有一个根结点&#xff0c;除根结点外每个孩子结点可以有多个后继&#xff0c;没有后继的结点叫叶子结点。 2.概念 根结点&#xff1a;没有前驱&#xff1b; 孩子&#xff1a;有前驱的结点&#xff1b;…

NLP预训练范式大一统,不再纠结下游任务类型,谷歌这个新框架刷新50个SOTA

来源&#xff1a;机器之心编辑&#xff1a;张倩、小舟在这篇论文中&#xff0c;来自谷歌的研究者提出了一种统一各种预训练范式的预训练策略&#xff0c;这种策略不受模型架构以及下游任务类型影响&#xff0c;在 50 项 NLP 任务中实现了 SOTA 结果。当前&#xff0c;NLP 研究人…

赫夫曼树编码的算法及应用习题--数据结构

赫夫曼树编码的算法及应用习题 1.构造赫夫曼树的方法 1.根据给定的n个权值{w1,w2,---wn},构成n棵二叉树的集合F{T1,T2...,Tn}&#xff0c;其中每棵二叉树中只有一个带权为Wi的根结点&#xff0c;其左右子树为空。 2.在F中选取两棵根结点的权值最小的树作为左右子树&#xff…

吴咏时:未来基础学科发展的“铁三角”

来源&#xff1a; 节选自《物理》2022年第5期《圆桌论坛&#xff1a;对21世纪物理学的愿景展望》。2021年9月&#xff0c;在清华大学举行“庆祝杨振宁先生百年华诞思想研讨会”圆桌论坛环节上&#xff0c;美国犹他大学教授吴咏时对今后基础物理学做了一番展望。他指出了基础物理…

树的叶子结点与完全二叉树结点计算方法

一&#xff1a;完全二叉树中结点问题 分析&#xff1a; 设叶子节点个数为n0,度为1的节点个数为n1,度为2的节点个数为n2 侧有 n0n1n2n (1) 对于二叉树有&#xff1a; n0n21 (2) 由(1)(2) > n0(n1-n1)/2 (3) 由完全二叉树…

图的知识点总结-数据结构

一&#xff1a;图的基本概念和术语 1.图之间的关系可以是任意的&#xff0c;任意两个数据元素之间都可能相关。 2.顶点&#xff1a;数据元素。 3.边or弧&#xff1a;从一个顶点到另一个顶点的路径。<V, W>表示弧&#xff0c;&#xff08;V,W&#xff09;表示边&#x…

当物理学遇到机器学习:基于物理知识的机器学习综述

来源&#xff1a;集智俱乐部作者&#xff1a;潘佳栋 审校&#xff1a;梁金编辑&#xff1a;邓一雪摘要物理信息机器学习&#xff08;Physics-informed machine learning&#xff0c;PIML&#xff09;&#xff0c;指的是将物理学的先验知识&#xff08;历史上自然现象和人类行为…

图的遍历——深度优先搜索+广度优先搜索

一&#xff1a;图的遍历——深度优先搜索 在本文其他内容中只是大体概括了主要的图论内容&#xff0c;更加详细的代码实现及算法分析在此给出。 深度优先搜索&#xff08;DFS&#xff09;类似树的先序遍历。 假设初始状态是图中所有顶点未曾被访问&#xff0c;则深度优先搜索…

RISC-V何以成功?

来源&#xff1a;AI前线作者&#xff1a;BRIAN BAILEY译者&#xff1a;王强策划&#xff1a;刘燕RISC-V 处理器架构的诞生毫无疑问让很多人都为之兴奋不已。然而&#xff0c;尽管许多人都说 RISC-V 预示着我们将迎来更广泛的开源硬件运动&#xff0c;但这种架构究竟为什么取得成…

最小生成树——普里姆算法和克鲁斯卡尔算法

最小生成树 用来解决工程中的代价问题。 一&#xff1a;普里姆算法 具体代码用C语言实现如下&#xff1a; typedef int VRType;typedef char InfoType;#define MAX_NAME 3 /* 顶点字符串的最大长度1 */#define MAX_INFO 20 /* 相关信息字符串的最大长度1 */typedef char Vert…

大雅之美:十位大数学家心中最美的公式

来源&#xff1a;本文译自 http://www.concinnitasproject.org/portfolio/&#xff0c;中译文曾发表于 《中国数学会通讯》2017 年第 1 期。译者&#xff1a;刘云朋&#xff0c;天津大学理学院校译&#xff1a;林开亮大雅之美&#xff1a;十位大数学家心中最美的公式牛顿法Ste…

TabError的解决方法

问题&#xff1a;Python文件运行时报TabError: inconsistent use of tabs and spaces in indentation 原因&#xff1a;说明Python文件中混有Tab和Space用作格式缩进。这通常是使用外部编辑器编辑Python文件时&#xff0c;自动采用Tab进行格式缩进。 解决&#xff1a;将Tab转…

《Nature》:给老年小鼠注射年轻小鼠的脑脊液可以改善记忆力!

来源&#xff1a;生物通一个国际研究团队发现&#xff0c;向老年小鼠注射年轻小鼠的脑脊液可以改善记忆。在发表在《自然》(Nature)杂志上的论文中&#xff0c;该小组描述了一种技术&#xff0c;可以从年轻小鼠体内取出少量脑脊液&#xff0c;并将其注射到年老小鼠的大脑中&…

HashSet存储自定义对象保证元素唯一性图解原理及代码优化

HashSet存储自定义对象保证元素唯一性图解原理及代码优化 1.原理&#xff1a; * 1.HashSet原理 * 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数 * 当Hash…

马斯克:推特发帖机器人太多,现在起搁置440亿美元收购

来源&#xff1a;智能研究院前言直播「尽职调查」&#xff0c;压价还是打退堂鼓&#xff1f;「因为现在要计算推特上虚假账号的数量是否占 5% 以下&#xff0c;所以推特的收购暂时被搁置了&#xff0c;」5 月 13 日晚&#xff0c;全球首富伊隆 马斯克突然发推说道。马斯克与推…

Web 3.0?高成本版的P2P而已

来源&#xff1a;AI前线作者&#xff1a;Marcel Waldvogel译者&#xff1a;核子可乐策划&#xff1a;钰莹最近&#xff0c;Web 3.0 火的不行&#xff0c;有人认为&#xff0c;它将是互联网的未来式&#xff0c; Web 3.0 代表着对互联网的根本性改造&#xff0c;一个新的 Web 世…

JAVA面试题:HashMap和Hashtable的区别

HashMap和Hashtable的区别 1.共同点:都是双列集合,底层都是哈希算法 2.区别: * 1.HashMap是线程不安全的&#xff0c;效率高&#xff0c;JDK1.2版本 * Hashtable是线程安全的&#xff0c;效率低&#xff0c;JDK1.0版本 * 2.HashMap可以存储null键和null值 * Hashtable不可以存…