简述二叉链表的类型定义
- 格式:docx
- 大小:4.42 KB
- 文档页数:8
数据结构(⼆⼗四)⼆叉树的链式存储结构(⼆叉链表) ⼀、⼆叉树每个结点最多有两个孩⼦,所以为它设计⼀个数据域和两个指针域,称这样的链表叫做⼆叉链表。
⼆、结点结构包括:lchild左孩⼦指针域、data数据域和rchild右孩⼦指针域。
三、⼆叉链表的C语⾔代码实现:#include "string.h"#include "stdio.h"#include "stdlib.h"#include "io.h"#include "math.h"#include "time.h"#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define MAXSIZE 100 /* 存储空间初始分配量 */typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 *//* ⽤于构造⼆叉树********************************** */int index=1;typedef char String[24]; /* 0号单元存放串的长度 */String str;Status StrAssign(String T,char *chars){int i;if(strlen(chars)>MAXSIZE)return ERROR;else{T[0]=strlen(chars);for(i=1;i<=T[0];i++)T[i]=*(chars+i-1);return OK;}}/* ************************************************ */typedef char TElemType;TElemType Nil=''; /* 字符型以空格符为空 */Status visit(TElemType e){printf("%c ",e);return OK;}typedef struct BiTNode /* 结点结构 */{TElemType data; /* 结点数据 */struct BiTNode *lchild,*rchild; /* 左右孩⼦指针 */}BiTNode,*BiTree;/* 构造空⼆叉树T */Status InitBiTree(BiTree *T){*T=NULL;return OK;}/* 初始条件: ⼆叉树T存在。
2018年1月自学考试数据结构试题课程代码:02331一、单项选择题(本大题共15小题,每小题2分,共30分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。
错选、多选或未选均无分。
1.下列程序段的时间复杂度为( )s=0;for(i=1;i<n;i++)for(j=1;j<n;j++)s+=i*j;A.O(1)B.O(n)C.O(2n)D.O(n2)2.假设某个带头结点的单链表的头指针为head,则判定该表为空表的条件是( )A.head==NULL;B.head->next==NULL;C.head!=NULL;D.head->next==head;3.栈是一种操作受限的线性结构,其操作的主要特征是( )A.先进先出B.后进先出C.进优于出D.出优于进4.假设以数组A[n]存放循环队列的元素,其头、尾指针分别为front和rear。
若设定尾指针指向队列中的队尾元素,头指针指向队列中队头元素的前一个位置,则当前存于队列中的元素个数为( ) A.(rear-front-1)%n B.(rear-front)%nC.(front-rear+1)%nD.(rear-front+n)%n5.判断两个串大小的基本准则是( )A.两个串长度的大小B.两个串中首字符的大小C.两个串中大写字母的多少D.对应的第一个不等字符的大小6.二维数组A[4][5]按行优先顺序存储,若每个元素占2个存储单元,且第一个元素A[0][0]的存储地1址为1000,则数组元素A[3][2]的存储地址为( )A.1012B.1017C.1034D.10367.高度为5的完全二叉树中含有的结点数至少为( )A.16B.17C.31D.328.已知在一棵度为3的树中,度为2的结点数为4,度为3的结点数为3,则该树中的叶子结点数为( )A.5B.8C.11D.18)9.下列所示各图中是中序线索化二叉树的是(A.(v0,v1,v2,v5,v4,v3)B.(v0,v1,v2,v3,v4,v5)C.(v0,v1,v5,v2,v3,v4)D.(v0,v1,v4,v5,v2,v3)11.如图所示有向图的一个拓扑序列是( )A.ABCDEFB.FCBEADC.FEDCBAD.DAEBCF12.下列关键字序列中,构成大根堆的是( )23A.5,8,1,3,9,6,2,7B.9,8,1,7,5,6,2,33C.9,8,6,3,5,l ,2,7D.9,8,6,7,5,1,2,313.对长度为15的有序顺序表进行二分查找,在各记录的查找概率均相等的情况下,查找成功时所需进行的关键字比较次数的平均值为( ) A.1539B.1549C.1551D.155514.已知一个散列表如图所示,其散列函数为H(key)=key %11,采用二次探查法处理冲突,则下一个插入的关键字49的地址为( )15.数据库文件是由大量带有结构的( )A.记录组成的集合B.字符组成的集合C.数据项组成的集合D.数据结构组成的集合二、填空题(本大题共10小题,每小题2分,共20分)请在每小题的空格中填上正确答案。
第5章习题答案一、选择1.以下说法错误的是 ( )A.树形结构的特点是一个结点可以有多个直接前趋B.线性结构中的一个结点至多只有一个直接后继C.树形结构可以表达(组织)更复杂的数据D.树(及一切树形结构)是一种"分支层次"结构2,以下说法错误的是 ( BC )A.二叉树可以是空集B.二叉树的任一结点都有两棵子树(是“最多有”两棵子树)C.二叉树与树具有相同的树形结构(二叉树的孩子必有左右之分,只有一个孩子时也要分出左右,而树即使是有序树, 只有一个孩子时部分左右)D.二叉树中任一结点的两棵子树有次序之分3、以下说法错误的是( )A.完全二叉树上结点之间的父子关系可由它们编号之间的关系来表达B.在三叉链表上,二叉树的求双亲运算很容易实现C.在二叉链表上,求根,求左、右孩子等很容易实现D.在二叉链表上,求双亲运算的时间性能很好4、以下说法错误的是 ( )A.一般在哈夫曼树中,权值越大的叶子离根结点越近B.哈夫曼树中没有度数为1的分支结点C.若初始森林中共有n裸二叉树,最终求得的哈夫曼树共有2n-1个结点D.若初始森林中共有n裸二叉树,进行2n-1次合并后才能剩下一棵最终的哈夫树5.深度为6的二叉树最多有( )个结点 ( )A.64B.63C.32D.316.将含有83个结点的完全二叉树从根结点开始编号,根为1号,后面按从上到下、从左到右的顺序对结点编号,那么编号为41的双结点编号为 ( )A.42B.40C.21D.207.设二叉树有n个结点,则其深度为( )A.n-1B.nC.5floor(log2n)D.无法确定注:完全二叉树才能确定其深度。
8.设深度为k的二叉树上只有度为0 和度为2 的节点,则这类二叉树上所含结点总数最少()个A.k+1B.2kC.2k-1D.2k+1注:单支数含结点个数最少,但题目规定该二叉树中不存在度为1的结点。
所以,在单支树的基础上把结点补齐,使之度数为2 或 0,结果就是有2k-1个结点。
【课后习题】第6章树和二叉树网络工程2010级()班学号:姓名:一、填空题(每空1分,共16分)1.从逻辑结构看,树是典型的。
2.设一棵完全二叉树具有999个结点,则此完全二叉树有个叶子结点,有个度为2的结点,有个度为1的结点。
3.由n个权值构成的哈夫曼树共有个结点。
4.在线索化二叉树中,T所指结点没有左子树的充要条件是。
5.在非空树上,_____没有直接前趋。
6.深度为k的二叉树最多有结点,最少有个结点。
7.若按层次顺序将一棵有n个结点的完全二叉树的所有结点从1到n编号,那么当i为且小于n时,结点i的右兄弟是结点,否则结点i没有右兄弟。
8.N个结点的二叉树采用二叉链表存放,共有空链域个数为。
9.一棵深度为7的满二叉树有___ ___个非终端结点。
10.将一棵树转换为二叉树表示后,该二叉树的根结点没有。
11.采用二叉树来表示树时,树的先根次序遍历结果与其对应的二叉树的遍历结果是一样的。
12.一棵Huffman树是带权路径长度最短的二叉树,权值的外结点离根较远。
二、判断题(如果正确,在对应位置打“√”,否则打“⨯”。
每题0.5分,共5分)1.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i-1个结点。
2.二叉树的前序遍历并不能唯一确定这棵树,但是,如果我们还知道该二叉树的根结点是那一个,则可以确定这棵二叉树。
3.一棵树中的叶子结点数一定等于与其对应的二叉树中的叶子结点数。
4.度≤2的树就是二叉树。
5.一棵Huffman树是带权路径长度最短的二叉树,权值较大的外结点离根较远。
6.采用二叉树来表示树时,树的先根次序遍历结果与其对应的二叉树的前序遍历结果是一样的。
7.不存在有偶数个结点的满二叉树。
8.满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树。
9.已知二叉树的前序遍历顺序和中序遍历顺序,可以惟一确定一棵二叉树;10.已知二叉树的前序遍历顺序和后序遍历顺序,不能惟一确定一棵二叉树;三、单项选择(请将正确答案的代号填写在下表对应题号下面。
第六章树一.名词解释:1 树 2。
结点的度 3。
叶子 4。
分支点 5。
树的度6.父结点、子结点 7兄弟 8结点的层数 9树的高度 10 二叉树11 空二叉树 12 左孩子、右孩子 13孩子数 14 满二叉树 15完全二叉树16 先根遍历 17 中根遍历 18后根遍历 19二叉树的遍历 20 判定树21 哈夫曼树二、填空题1、树(及一切树形结构)是一种“________”结构。
在树上,________结点没有直接前趋。
对树上任一结点X来说,X是它的任一子树的根结点惟一的________。
2、一棵树上的任何结点(不包括根本身)称为根的________。
若B是A的子孙,则称A是B的________3、一般的,二叉树有______二叉树、______的二叉树、只有______的二叉树、只有______ 的二叉树、同时有______的二叉树五种基本形态。
4、二叉树第i(i>=1)层上至多有______个结点。
5、深度为k(k>=1)的二叉树至多有______个结点。
6、对任何二叉树,若度为2的节点数为n2,则叶子数n0=______。
7、满二叉树上各层的节点数已达到了二叉树可以容纳的______。
满二叉树也是______二叉树,但反之不然。
8、具有n个结点的完全二叉树的深度为______。
9、如果将一棵有n个结点的完全二叉树按层编号,则对任一编号为i(1<=i<=n)的结点X有:(1)若i=1,则结点X是______;若i〉1,则X的双亲PARENT(X)的编号为______。
(2)若2i>n,则结点X无______且无______;否则,X的左孩子LCHILD(X)的编号为______。
(3)若2i+1>n,则结点X无______;否则,X的右孩子RCHILD(X)的编号为______。
10.二叉树通常有______存储结构和______存储结构两类存储结构。
11.每个二叉链表的访问只能从______结点的指针,该指针具有标识二叉链表的作用。
数据结构名词解释和时间复杂度名词解释数据结构:是相互之间存在一种或多种特定关系的数据元素的集合,是计算机存储和数据组织的方式,它分为三个方面,即数据的逻辑结构,数据的物理结构,数据的操作。
数据元素:数据元素构成数据,也是数据的基本单位。
数据项:是数据不可分割的最小单位,用它可以识别一个或一个组数据,一个数据元素可由若干数据项组成。
数据对象:是性质相同的数据元素的集合,是数据的一个子集。
数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中被计算机程序处理的符号的总称,是计算机化的信息。
数据类型:是一个值的集合以及定义在这个值集上的一组操作,可分为原子类型和结构类型。
抽象数据类型:是基于一类逻辑关系的数据类型以及定义在这个类型之上的一组操作。
逻辑结构:是数据元素之间逻辑关系的描述。
物理结构(存储结构):是指数据的逻辑结构在计算机中的映像(又称表示),即数据结构在计算机中的存储方法。
算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
时间复杂度:算法执行所需时间的量度。
空间复杂度:算法执行所需存储空间的量度。
存储密度:指结点数据本身所占存储量和整个结构所占存储量之比。
程序设计的一些基本原则:分解、抽象和信息隐蔽。
根据数据元素之间关系的不同特性,有四类基本的数据结构:集合结构,线性结构,树形结构,图形结构(网状结构)。
数据的存储结构有:顺序存储结构、链式(链接)存储结构、索引结构、散列存储结构常用的两种存储结构:顺序存储结构和链式存储结构。
算法的五个特性:确定性、有穷性、可行性、输入和输出。
(可以有零个或多个数据输入,但必须至少有一个输出数据。
算法设计的要求:正确性、可读性、稳健性、高效率低存储量。
(算法分析)衡量算法的两个标准:时间复杂度和空间复杂度。
一个算法的设计取决于所选的逻辑结构。
一个算法的实现取决于所选的存储结构。
结构化程序设计思想的要求:自顶向下、逐步细化、模块化设计、结构化编程。
习题六树和二叉树一、单项选择题1.以下说法错误的是 ( )A.树形结构的特点是一个结点可以有多个直接前趋B.线性结构中的一个结点至多只有一个直接后继C.树形结构可以表达(组织)更复杂的数据D.树(及一切树形结构)是一种"分支层次"结构E.任何只含一个结点的集合是一棵树2.下列说法中正确的是 ( )A.任何一棵二叉树中至少有一个结点的度为2B.任何一棵二叉树中每个结点的度都为2C.任何一棵二叉树中的度肯定等于2D.任何一棵二叉树中的度可以小于23.讨论树、森林和二叉树的关系,目的是为了()A.借助二叉树上的运算方法去实现对树的一些运算B.将树、森林按二叉树的存储方式进行存储C.将树、森林转换成二叉树D.体现一种技巧,没有什么实际意义4.树最适合用来表示 ( )A.有序数据元素 B.无序数据元素C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据5.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是()A.9 B.11 C.15 D.不确定6.设森林F中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。
与森林F 对应的二叉树根结点的右子树上的结点个数是()。
A.M1 B.M1+M2 C.M3 D.M2+M37.一棵完全二叉树上有1001个结点,其中叶子结点的个数是()A. 250 B. 500 C.254 D.505 E.以上答案都不对8. 设给定权值总数有n 个,其哈夫曼树的结点总数为( )A.不确定 B.2n C.2n+1 D.2n-19.二叉树的第I层上最多含有结点数为()A.2I B. 2I-1-1 C. 2I-1 D.2I -110.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( )结点A.2h B.2h-1 C.2h+1 D.h+111. 利用二叉链表存储树,则根结点的右指针是()。
A.指向最左孩子 B.指向最右孩子 C.空 D.非空12.已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历的结果为()。
⼴东财经⼤学硕⼠研究⽣⼊学考试试卷2019年809-数据结构(⾃命题)⼴东财经⼤学硕⼠研究⽣⼊学考试试卷考试年度:2019年考试科⽬代码及名称:809-数据结构(⾃命题)适⽤专业:085211 ⼯程硕⼠(计算机技术)[友情提醒:请在考点提供的专⽤答题纸上答题,答在本卷或草稿纸上⽆效!]⼀、单项选择题(10题,每题2分,共20分)1、设n是描述问题规模的⾮负整数,下⾯的程序⽚段的时间复杂度是________。
i=2;while(i<=n)i=i*2;A.O(n2) B.O(n) C.O(nlog 2 n) D.O(log 2 n)2、在双向链表存储结构中,删除p所指的结点时须修改指针()。
A.p->next->prior=p->prior; p->prior->next=p->next;B.p->next=p->next->next; p->next->prior=p;C.p->prior->next=p; p->prior=p->prior->prior;D.p->prior=p->next->next; p->next=p->prior->prior;3、设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次进⼊栈S,⼀个元素出栈后即进⼊Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量⾄少应该是________。
A.2 B.3 C.4 D. 64、设有⼀个递归算法如图1所⽰则计算fact(n)需要调⽤该函数的次数为________。
A.n+1 B.n-1 C. n D. n+25、对图2所⽰的带权有向图,若采⽤迪杰斯特拉(Dijkstra)算法求从原点a到其他各顶点的最短路径,则得到的第⼀条最短路径的⽬标顶点是b,第⼆条最短路径的⽬标顶点是c,后续得到的其余各最短路径的⽬标顶点依次是________。
数据结构与算法基础考试(答案见尾页)一、选择题1. 数据结构中,以下哪个是线性结构?A. 链表B. 栈C. 队列D. 二叉树2. 在算法分析中,以下哪个不是时间复杂度的组成部分?A. 时间复杂度B. 空间复杂度C. 时间步长D. 平均时间复杂度3. 以下哪个排序算法的时间复杂度为O(n^)?A. 快速排序B. 归并排序C. 堆排序D. 插入排序4. 在计算机中,以下哪种数据结构可以最有效地进行字符串匹配?A. 数组B. 链表C. 栈D. 哈希表5. 以下哪个图算法用于寻找最短路径?A. 拉普拉斯矩阵B. 关联矩阵C. 迪杰斯特拉算法D. A*搜索算法6. 以下哪个数据结构可以用来实现栈和队列?A. 数组B. 链表C. 栈D. 哈希表7. 在机器学习中,以下哪种算法属于监督学习?A. 决策树B. 聚类C. 逻辑回归D. 神经网络8. 以下哪个算法用于解决整数分解问题?A. RSA加密B. Diffie-Hellman密钥交换C. 数字签名D. ElGamal加密9. 在数据库管理中,以下哪个概念与数据的物理存储无关?A. 表空间B. 水平分割C. 垂直分割D. 存储过程10. 以下哪个编程语言不适合初学者学习数据结构和算法?A. PythonB. JavaC. C++D. JavaScript11. 什么是数据结构?请列举几种常见的数据结构,并简要描述它们的特点。
B. 链表C. 栈D. 队列E. 图12. 算法的时间复杂度是如何衡量的?请举例说明不同时间复杂度的算法。
A. O(1)B. O(log n)C. O(n)D. O(n^2)E. O(2^n)13. 什么是递归?请列举两种递归的例子,并解释它们如何工作。
A. 汉诺塔问题B. 二分查找C. 幂运算D. 斐波那契数列E. 求最大公约数14. 什么是栈?请列举栈的基本操作,并说明它们是如何实现的。
A. 后进先出(LIFO)B. 先进先出(FIFO)C. 帧栈D. 递归E. LIFO15. 什么是队列?请列举队列的基本操作,并说明它们是如何实现的。
数据结构⾃考试题及答案全国2006年10⽉⾼等教育⾃学考试数据结构试题课程代码:02331⼀、单项选择题(本⼤题共15⼩题,每⼩题2分,共30分)在每⼩题列出的四个备选项中只有⼀个是符合题⽬要求的,请将其代码填写在题后的括号内。
错选、多选或未选均⽆分。
1.数据结构是()A.⼀种数据类型B.数据的存储结构C.⼀组性质相同的数据元素的集合D.相互之间存在⼀种或多种特定关系的数据元素的集合2.算法分析的⽬的是()A.辨别数据结构的合理性B.评价算法的效率C.研究算法中输⼊与输出的关系D.鉴别算法的可读性3.在线性表的下列运算中,不.改变数据元素之间结构关系的运算是()A.插⼊B.删除C.排序D.定位4.若进栈序列为1,2,3,4,5,6,且进栈和出栈可以穿插进⾏,则可能出现的出栈序列为()A.3,2,6,1,4,5 B.3,4,2,1,6,5C.1,2,5,3,4,6 D.5,6,4,2,3,15.设串sl=″Data Structures with Java″,s2=″it″,则⼦串定位函数index(s1,s2)的值为()A.15 B.16C.17 D.186.⼆维数组A[8][9]按⾏优先顺序存储,若数组元素A[2][3]的存储地址为1087,A[4][7]的存储地址为1153,则数组元素A[6][7]的存储地址为()A.1207 B.1209C.1211 D.12137.在按层次遍历⼆叉树的算法中,需要借助的辅助数据结构是()A.队列B.栈C.线性表D.有序表8.在任意⼀棵⼆叉树的前序序列和后序序列中,各叶⼦之间的相对次序关系()A.不⼀定相同B.都相同C.都不相同D.互为逆序9.若采⽤孩⼦兄弟链表作为树的存储结构,则树的后序遍历应采⽤⼆叉树的()A.层次遍历算法B.前序遍历算法C.中序遍历算法D.后序遍历算法10.若⽤邻接矩阵表⽰⼀个有向图,则其中每⼀列包含的″1″的个数为()A.图中每个顶点的⼊度B.图中每个顶点的出度C.图中弧的条数D.图中连通分量的数⽬11.图的邻接矩阵表⽰法适⽤于表⽰()A.⽆向图B.有向图C.稠密图D.稀疏图12.在对n个关键字进⾏直接选择排序的过程中,每⼀趟都要从⽆序区选出最⼩关键字元素,则在进⾏第i 趟排序之前,⽆序区中关键字元素的个数为()A.i B.i+1C.n-i D.n-i+113.下列排序算法中,其时间复杂度和记录的初始排列⽆关的是()A.插⼊排序B.堆排序C.快速排序D.冒泡排序14.若有序表的关键字序列为(b,c,d,e,f,g,q,r,s,t),则在⼆分查找关键字b的过程中,先后进⾏⽐较的关键字依次为()A.f,c,b B.f,d,bC.g,c,b D.g,d,b15.若在⽂件中查询年龄在60岁以上的男性及年龄在55岁以上的⼥性的所有记录,则查询条件为()A.(性别=“男”)OR(年龄> 60)OR(性别=“⼥”)OR(年龄>55)B.(性别=“男”)OR(年龄> 60)AND(性别=“⼥”)OR(年龄>55)C.(性别=“男”)AND(年龄> 60)OR(性别=“⼥”)AND(年龄>55)D.(性别=“男”)AND(年龄> 60)AND(性别=“⼥”)AND(年龄>55)⼆、填空题(本⼤题共10⼩题,每⼩题2分,共20分)请在每⼩题的空格中填上正确答案。
第6章树(2008年1月)8、树的先根序列等同于与该树对应的二叉树的()A、先序序列B、中序序列C、后序序列D、层序序列21、假设一棵完全二叉树含1000个结点,则其中度为2的结点数为___________。
27、已知二叉树的先序序列和中序序列分别为ABDEHCFI和DBHEACIF,(1)画出该二叉树的二叉链表存储表示;(2)写出该二叉树的后序序列。
(1)(2)32、已知以二叉链表作二叉树的存储结构,阅读算法f32,并回答问题:(1)设二叉树T如图所示,写出执行f32(T)的返回值;(2)简述算法f32的功能。
int f32(BinTree T){int m, n;if(! T)return 0;else{m= f32(T–>lchild);n = f 32(T–>rchild);if(m>n)return m +1;else return n+1;}}(1)(2)(2008年10月)7、已知一棵含50个结点的二叉树中只有一个叶子结点,则该树中度为1的结点个数为()A、0B、1C、48D、4921、假设用<x,y>表示树的边(其中x是y的双亲),已知一棵树的边集为{<b,d>,<a,b>,<c,g>,<c,f>,<c,h>,<a,c>},该树的度是。
26、由森林转换得到的对应二叉树如图所示,写出原森林中第三棵树的前序序列和后序序列。
前序序列:后序序列:(2009年1月)7、高度为5的完全二叉树中含有的结点数至少为( )A、16B、17C、31D、328、已知在一棵度为3的树中,度为2的结点数为4,度为3的结点数为3,则该树中的叶子结点数为( )A、5B、8C、11D、189、下列所示各图中是中序线索化二叉树的是( )21、在含有3个结点a,b,c的二叉树中,前序序列为abc且后序序列为cba的二叉树有_________棵。
简述二叉链表的类型定义
二叉链表是一种常见的数据结构,它是由节点组成的树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉链表的类型定义包括节点结构体和二叉链表结构体两部分。
节点结构体定义
节点结构体是二叉链表中最基本的数据单元,它包含三个成员变量:数据域、左子节点指针和右子节点指针。
其中,数据域用于存储节点的数据,左子节点指针和右子节点指针分别指向节点的左子节点和右子节点。
节点结构体的类型定义如下:
```
typedef struct BiTNode {
int data; // 数据域
struct BiTNode *lchild; // 左子节点指针
struct BiTNode *rchild; // 右子节点指针
} BiTNode, *BiTree;
```
在上面的代码中,BiTNode是节点结构体的别名,BiTree是指向节点结构体的指针类型。
节点结构体中的成员变量lchild和rchild都
是指向节点结构体的指针类型,它们分别指向节点的左子节点和右子节点。
二叉链表结构体定义
二叉链表结构体是由节点组成的树形结构,它包含一个指向根节点的指针。
二叉链表结构体的类型定义如下:
```
typedef struct {
BiTree root; // 指向根节点的指针
} BiTreeStruct;
```
在上面的代码中,BiTreeStruct是二叉链表结构体的别名,它包含一个指向根节点的指针root。
root指针指向节点结构体,表示二叉链表的根节点。
二叉链表的操作
二叉链表是一种常见的数据结构,它支持多种操作,包括创建二叉链表、遍历二叉链表、插入节点、删除节点等。
下面我们将介绍二叉链表的常见操作。
1. 创建二叉链表
创建二叉链表的过程就是构建二叉树的过程。
我们可以通过递归的方式来创建二叉链表。
具体步骤如下:
1. 如果当前节点为空,则返回NULL。
2. 创建一个新节点,并将数据存储到新节点的数据域中。
3. 递归创建左子树,将左子树的根节点指针赋值给新节点的左子节点指针。
4. 递归创建右子树,将右子树的根节点指针赋值给新节点的右子节点指针。
5. 返回新节点的指针。
下面是创建二叉链表的代码实现:
```
BiTree createBiTree() {
int data;
scanf("%d", &data);
if (data == -1) { // 如果当前节点为空,则返回NULL
return NULL;
}
BiTree node = (BiTree)malloc(sizeof(BiTNode)); // 创建一个
新节点
node->data = data; // 将数据存储到新节点的数据域中
node->lchild = createBiTree(); // 递归创建左子树
node->rchild = createBiTree(); // 递归创建右子树
return node; // 返回新节点的指针
}
```
在上面的代码中,我们通过scanf函数从标准输入中读取数据,如果读取到-1,则表示当前节点为空,返回NULL。
否则,我们创建一个新节点,并将数据存储到新节点的数据域中。
然后,我们递归创建左子树和右子树,并将左子树的根节点指针赋值给新节点的左子节点指针,将右子树的根节点指针赋值给新节点的右子节点指针。
最后,我们返回新节点的指针。
2. 遍历二叉链表
遍历二叉链表是指按照一定的顺序访问二叉链表中的所有节点。
常见的遍历方式包括前序遍历、中序遍历和后序遍历。
下面我们将介绍这三种遍历方式的实现方法。
前序遍历
前序遍历的顺序是先访问根节点,然后访问左子树,最后访问右子
树。
前序遍历的代码实现如下:
```
void preOrder(BiTree root) {
if (root == NULL) { // 如果当前节点为空,则返回
return;
}
printf("%d ", root->data); // 访问根节点
preOrder(root->lchild); // 遍历左子树
preOrder(root->rchild); // 遍历右子树
}
```
在上面的代码中,我们首先判断当前节点是否为空,如果为空,则返回。
否则,我们访问当前节点的数据域,然后递归遍历左子树和右子树。
中序遍历
中序遍历的顺序是先访问左子树,然后访问根节点,最后访问右子树。
中序遍历的代码实现如下:
```
void inOrder(BiTree root) {
if (root == NULL) { // 如果当前节点为空,则返回
return;
}
inOrder(root->lchild); // 遍历左子树
printf("%d ", root->data); // 访问根节点
inOrder(root->rchild); // 遍历右子树
}
```
在上面的代码中,我们首先判断当前节点是否为空,如果为空,则返回。
否则,我们递归遍历左子树,然后访问当前节点的数据域,最后递归遍历右子树。
后序遍历
后序遍历的顺序是先访问左子树,然后访问右子树,最后访问根节点。
后序遍历的代码实现如下:
```
void postOrder(BiTree root) {
if (root == NULL) { // 如果当前节点为空,则返回
return;
}
postOrder(root->lchild); // 遍历左子树
postOrder(root->rchild); // 遍历右子树
printf("%d ", root->data); // 访问根节点
}
```
在上面的代码中,我们首先判断当前节点是否为空,如果为空,则返回。
否则,我们递归遍历左子树和右子树,最后访问当前节点的数据域。
3. 插入节点
插入节点是指向二叉链表中插入一个新节点。
插入节点的过程可以分为两步:查找插入位置和插入新节点。
具体步骤如下:
1. 查找插入位置:从根节点开始,按照二叉搜索树的规则查找插入位置。
2. 插入新节点:将新节点插入到查找到的位置。
下面是插入节点的代码实现:
```
void insertNode(BiTree *root, int data) {
if (*root == NULL) { // 如果当前节点为空,则创建一个新节点 BiTree node = (BiTree)malloc(sizeof(BiTNode));
node->data = data;
node->lchild = NULL;
node->rchild = NULL;
*root = node;
return;
}
if (data < (*root)->data) { // 如果插入数据小于当前节点的数据,则递归插入左子树
insertNode(&((*root)->lchild), data);。