假设二叉树采用二叉链存储结构存储(仅供借鉴)

合集下载

数据结构 试题(A)-答案

数据结构 试题(A)-答案
评分标准:有向图、无向图两种存储方式各占4分。
3.建立平衡二叉树过程如图2所示(图中加阴影的结点表示要调整的结点)。
图2构造平衡二叉树过程
评分标准:每次调整占1分。
4.答:不能。因为在这里,二分查找只减少了关键字间的比较次数,而记录的移动次数不变,时间的复杂度仍为O(n2)。
评分标准:答对“不能”占3分,说明理由占5分。
A.872B.860
C.868D.864
8.一个具有1025个结点的二叉树的高h为。
A.11B.10
C.11~1025D.12~1024
9.一棵二叉树的后序遍历序列为DABEC,中序遍历序列为DEBAC,则先序遍历序列为。
A.ACBEDB.DECAB
C.DEABCD.CEDBA
10.对图1所示的无向图,从顶点1开始进行深度优先遍历;可得到顶点访问序列。
2.给出如下各种情况下求任意一个顶点的度的过程(只需文字描述):(8分)
(1)含n个顶点的无向图采用邻接矩阵存储;
(2)含n个顶点的无向图采用邻接表存储;
(3)含n个顶点的有向图采用邻接矩阵存储;
(4)含n个顶点的有向图采用邻接表存储。
3.将整数序列{4,5,7,2,1,3,6}中的数依次插入到一棵空的平衡二叉树中,试构造相应的平衡二叉树。(要求画出每个元素插入过程,若需调整,还需给出调整后的结果,并指出是什么类型的调整,12分)
A.输出第i(1≤i≤n)个元素值
B.交换第1个元素与第2个元素的值
C.顺序输出这n个元素的值
D.输出与给定值x相等的元素在线性表中的序号
4.设n个元素进栈序列是p1,p2,p3,…,pn,其输出序列是1,2,3,…,n,若p3=3,则p1的值。
A.可能是2B.一定是2

算法设计练习题

算法设计练习题

算法设计练习题1、设一棵二叉树以二叉链表为存储结构,结点结构为。

设计一个算法,求在前根序列中处于第k个位置的结点。

2、设某单链表L的结点结构为编写算法判断该链表的元素是否是递增的。

3、设有一单链表L,结点结构为3个,试画出链表L的结构图,并编写算法判断该单链表L中的元素是否成等差关系,即:设各元素值次为a1,a2,a3,…,a n,判断a i+1-a i=a i-a i-1是否成立,其中i满足2<=i<=n-1.4、设有一棵二叉树以二叉链表作为存储结构,结点结构为其中data数字的字符(即‘0’<=data<=‘9’)5、写出一个在带头结点的单链表上删除表中第i个结点的算法。

单链表的结点类型及单链表类型定义:typedef struct node{ DataType data;struct node *next;}Node, *LinkList;6、给出求二叉树的结点数的算法。

二叉树的二叉链表存储表示:typedef struct BiTNode{ DataType data;struct BiTNode *lchild,*rchild;}BiTNode, *BiTree;7. 写出一个删除单链表的表头结点和表尾结点的算法。

单链表的结点类型及单链表类型定义:typedef struct node{ DataType data;struct node *next;}Node, *LinkList;8、已知一带头结点的单链表,由头指针H指向,其结点的类型如下:typedef struct node{ elemtype data;struct node *next;}NODE,*NODEPTR;现要在链表中删除其关键字为aidkey的结点,其程序如下:int deletelm(NODEPTR H,keytype aidkey)/*若删除成功,则返回1,否则返回0*/{ NODEPTR pre,p;pre=H;p=H->next;while(p&&p->data.key!=aidkey){ pre=p;①;}if(p){ ②;free(p);return 1;}else return 0;}9、已知待排序的线性表的结构定义如下:#define MAXSIZE 200typedef int keytype;typedef struct{ keytype key;othertype other;}redtype;typedef struct{ redtype r[MAXSIZE];int length;}sqlist;其中L->r[0]用于作临时单元,数据从L->r[1]开始存放。

数据结构参考答案

数据结构参考答案

简答一.1、已知模式串pat=’ADABBADADA’,写出该模式串的next函数值和nextval值;2、模式匹配算法是在主串中快速寻找模式的一种有效的方法,如果设主串的长度为m,模式的长度为n,则在主串中寻找模式的KMP算法的时间复杂性是多少?如果,某一模式 P=’abcaacabaca’,请给出它的NEXT函数值及NEXT函数的修正值NEXTVAL之值。

3、已知模式串pat=“abaabc”,写出该模式串的next函数值和nextval值;4、给出字符串‘abacabaaad’在KMP算法中的next和nextval数组。

二、(意思对即可,不一定是这种写法)1、数据结构按照逻辑结构分为哪四种结构,说出元素之间的关系?集合:无关系线性结构:一对一树形结构:一对多图形结构:多对多2、图形结构有几种存储结构?分别是什么存储结构?4种。

邻接矩阵,邻接表,十字链表,邻接多重表3、度数为2的树和二叉树有何区别?(1)度为2的树中至少有一个结点的度为2,而二叉树中没有这种要求。

(2)度为2的树不区分左右子树,而二叉树严格区分左右子树。

4、简述栈和队列的特点。

栈:是一种只能在一端进行插入或删除操作的线性表。

“后进先出”队列:是一种仅允许在表的一端进行插入操作,而在表的另一端进行删除操作的受限的线性表“先进先出”三(只是最终的结果,有的题可能需要中间步骤,自己完善一下)1、已知某有向图的顶点集合为{A,B,C,D,E,F},边集合为{〈A,B〉,〈A,C〉,〈A,E〉,〈C,F〉,〈E,D〉},画出该图的邻接表,以它为基写出深度优先、广度优先遍历序列(深度、广度遍历要求从结点A开始)。

深度:A B C F E D广度:A B C E F D2、设无向图G(如右图所示),给出该图的最小生成树上边的集合并计算最小生成树各边上的权值之和。

3、对下图所示的无向图,从顶点1开始,写出该图的深度优先遍历和广度优先遍历。

假设二叉树采用二叉链存储结构存储

假设二叉树采用二叉链存储结构存储

假设二叉树采用二叉链存储结构存储二叉树是一种常见的数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。

在二叉链存储结构中,每个节点包含三个元素:数据域、左孩子指针和右孩子指针。

在二叉链存储结构中,每个节点都有一个指向其左孩子和右孩子的指针。

如果一个节点没有左孩子或右孩子,则对应的指针为空。

根节点是二叉树中最顶层的节点,没有父节点。

每个节点最多有一个父节点。

二叉链存储结构具有以下特点:1.较为灵活:可以方便地实现二叉树的各种操作,如插入、删除、查找等。

2.空间效率高:相比于顺序存储结构,它只需要额外的指针来保存孩子节点的地址,不需要为节点的空间分配固定大小的空间。

3.可以实现树的快速遍历:因为每个节点都有指向其孩子节点的指针,可以较快地遍历左右子树。

下面我们来详细介绍二叉链存储结构的设计和各种操作。

1.设计二叉链存储结构的节点:```pythonclass BinaryTreeNode:def __init__(self, data):self.data = data # 节点数据self.left_child = None # 左子节点的指针self.right_child = None # 右子节点的指针```2.创建二叉树:```pythondef create_binary_tree(:#创建二叉树的过程中可以根据需要进行节点的插入操作root = BinaryTreeNode(1)node2 = BinaryTreeNode(2)node3 = BinaryTreeNode(3)node4 = BinaryTreeNode(4)node5 = BinaryTreeNode(5)root.left_child = node2root.right_child = node3node2.left_child = node4node2.right_child = node5return root```3.二叉树的遍历:-前序遍历:先遍历根节点,然后遍历左子树,最后遍历右子树。

数据结构第二单元练习题答案【最新】

数据结构第二单元练习题答案【最新】

数据结构第二单元练习题答案一、选择1.树最适合用来表示( )A.有序数据元素B.无序数据元素C.元素之间具有分支层次关系的数据D.元素之间无联系的数据2.在下述结论中,正确的是( )①只有一个结点的二叉树的度为0; ②二叉树的度为2;③二叉树的左右子树可任意交换;④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。

A.①②③B.②③④C.②④D.①④3.以下说法正确的是( )A.任何一棵二叉树中至少有一个结点的度为2B.任何一棵二叉树中每个结点的度都为2C.任何一棵二叉树的度肯定等于2D.任何一棵二叉树的度可以小于24.在下列情况中,可称为二叉树的是( )A.每个结点至多有两棵子树的树B.哈夫曼树C.每个结点至多有两棵子树的有序树D.每个结点只有一棵右子树E.以上答案都不对5.深度为h的满m叉树的第k层有( )个结点(1=<k=<h)A.m k-1B.m k-1C.m h-1D.m h-16.在一棵高度为k的满二叉树中,结点总数为( )A.2k-1B.2kC.2k-1D.⎣log2k⎦+17.在一棵三元树中度为3的结点数为2个,度为2的结点数为1个,度为1的结点数为2个,则度为0的结点数为( )个A.4B.5C.6D.78.具有10个叶结点的二叉树中有( )个度为2的结点。

A.8B.9C.10D.ll9.二叉树有n个结点,则其深度为()A.n-1B.nC.(log2n)+`1 D.无法确定该题是二叉树不是完全二叉树由二叉树结点的公式:n=n0+n1+n2=n0+n1+(n0-1)=2n0+n1-1,因为n=1001,所以1002=2n0+n1,在完全二叉树树中,n1只能取0或1,在本题中只能取0,故n=501,因此选E。

10.一个具有1025个结点的二叉树的高h为( )A.11 B.10 C.11至1025之间 D.10至1024之间11.一棵具有 n个结点的完全二叉树的深度是( )A.⎣log2n⎦+1 B.log2n+1 C.⎣log2n⎦ D.log2n-112.将有关二叉树的概念推广到三叉树,则一棵有244个结点的完全三叉树的高度( )A.4B.5C.6D.713.将一棵有100个结点的完全二叉树从根结点这一层开始,每一层上从左到右依次对结点编号,根结点的编号为1,则编号为49的结点的左孩子编号为()A.98B.99C.50D.48利用二叉树的性质514.在完全二叉树中,若一个结点是叶结点,则它没( )A.左子结点B.右子结点C.左子结点和右子结点D.左子结点,右子结点和兄弟结点15.当一棵有n个结点的二叉树按层次从上到下,同层次从左到右将数据存放在一维数组A[l..n]中时,数组中第i个结点的左孩子为( )A.A[2i](2i=<n)B.A[2i+1](2i+1=<n)C.A[i/2]D.无法确定16.在下列存储形式中,( )不是树的存储形式?A.双亲表示法B.孩子链表表示法C.孩子兄弟表示法D.顺序存储表示法17.以下说法错误的是( )A.完全二叉树上结点之间的父子关系可由它们编号之间的关系来表达B.三叉链表,二叉树求双亲运算很容易实现C.在二叉链表上,求左.右孩子等很容易实现D.在二叉链表上,求双亲运算的时间性能很好18.对二叉树从1开始进行连续编号,要求每个结点的编号大于其左右孩子的编号,同一个结点的左右孩子中,其左孩子的编号小于其右孩子的编号,则可采用()次序的遍历实现编号。

武汉大学《数据结构》2020-2021学年第一学期期末试卷

武汉大学《数据结构》2020-2021学年第一学期期末试卷

武汉大学计算机学院2020-2021学年第一学期“数据结构”考试试题(A)姓名学号(序号)_学校要求:所有的题目的解答均写在答题纸上,需写清楚题目的序号。

每张答题纸都要写上姓名和序号。

一、单项选择题(每小题2分,共计20分)1.下列说法中,不正确的是。

A.数据元素是数据的基本单位B.数据项是数据中不可分割的最小可标识单位C.数据可由若干个数据元素构成D.数据项可由若干个数据元素构成2.对于一个线性表,既要求能够较快地进行节点插入和删除,又要求存储结构能够反映数据元素之间的逻辑关系,则应采用存储结构。

A.顺序B.链式C.散列D.索引3.如果以链表作为栈的存储结构,则退链栈操作时。

A.必须判断链栈是否满B.判断链栈元素的类型C.必须判断链栈是否空D.对链栈不作任何判断4.设循环队列中数组的下标是0~N-1,其头尾指针分别为f和r,则其元素个数为。

A.r-fB.r-f-1C.(r-f)%N+1D.(r-f+N)%N5.设二维数组A[6][10],每个数组元素占用4个存储单元,若按行优先顺序存放的数组元素,a[0][0]的存储地址为860,则a[3][5]的存储地址是。

A.1000B.860C.1140D.12006..一个无向图中有16条边,度为4的顶点有3个,度为3的顶点有4个,其余顶点的度均小于3,则该图至少有个顶点。

A.10B.11C.12D.137.采用邻接表存储的图的广度优先遍历算法类似于二叉树的算法。

A.先序遍历B.中序遍历C.后序遍历D.层次遍历8.一个有向图G的邻接表存储如图1所示,现按深度优先搜索遍历,从顶点0出发,所得到的顶点序列是。

图1有向图G 的邻接表A.0,1,2,3,4B.0,1,2,4,3C.0,1,3,4,2D.0,1,4,2,39.在含有27个节点的二叉排序树上,查找关键字为35的节点,则依次比较的关键字有可能是。

A.28,36,18,46,35B.18,36,28,46,35C.46,28,18,36,35D.46,36,18,28,3510.对关键字序列{15,9,7,8,20,-1,4}进行排序,进行一趟排序后数据序列变为{9,15,7,8,20,-1,4},则采用的是算法。

数据结构(树和二叉树)练习题与答案2

数据结构(树和二叉树)练习题与答案2

1、一颗二叉树的括号表示为“1(2(4,5(6,7)),3)”)。

设N代表二叉树的根,L代表根节点的左子树,R代表根节点的右子树。

若遍历后的节点序列为3,1,7,5,6,2,4,则其遍历方式是()。

A.NRLB.RLNC.LRND.RNL正确答案:D2、若二叉树(每个节点值为单个字符)的中序遍历序列是abcdef,且c为根节点,则()。

A.二叉树有两个度为0的节点B.二叉树的高度为5C.节点c有两个孩子D.以上都不对正确答案:C解析: C、从中序序列看出,节点c的左右子树均不空。

3、若知道一棵二叉树的(),便可以唯一确定该二叉树。

A.中序序列B.先序和后序序列C.中序和后序序列D.先序序列正确答案:C4、一棵二叉树的先序遍历序列为ABCDEFG,它的中序遍历序列可能是()。

A.ADCFEGB.ABCDEFGC.DACEFBGD.CABDEFG正确答案:B解析: B、当一棵二叉树所有节点的左子树为空时,先序遍历序列和中序遍历序列相同。

先序序列和中序序列可以确定一棵二叉树,这里由选项A、C和D的中序序列无法确定一棵二叉树。

5、一棵二叉树的先序遍历序列为ABCDEF,中序遍历序列为CBAEDF,则后序遍历序列为()A.FEDCBAB.CBEFDAC.CBEDFAD.不确定正确答案:B6、某棵二叉树中,X节点有左孩子Y节点,则在其先序遍历中()。

A.访问Y节点后,接着遍历Y节点的左子树,然后访问X节点B.访问X节点后,接着遍历Y节点的左子树,然后访问Y节点C.访问Y节点后立即访问X节点D.访问X节点后立即访问Y节点正确答案:D解析: D、其先序遍历序列为…XY…。

7、关于二叉树(含2个以上的节点)的先序遍历序列中,以下正确的是()。

A.先序遍历序列的最后一个节点是根节点B.先序遍历序列的最后一个节点一定是叶子节点C.以上都不对D.先序遍历序列的第一个节点一定是叶子节点正确答案:B解析: B、先序遍历过程是:NLR,最后访问的节点的L、R均为空,所以为叶子节点。

2014-2015学年第2学期算法与数据结构(AB)试题与标准答案

2014-2015学年第2学期算法与数据结构(AB)试题与标准答案

2014-2015学年第2学期考试试题(A)卷课程名称算法与数据结构任课教师签名出题教师签名审题教师签名考试方式(闭)卷适用专业信息与计算机考试时间(120)分钟一、单项选择题(每小题4分,共20分)1、算法的时间复杂度与()有关。

(A) 问题规模(B) 计算机硬件性能(C) 编译程序质量(D) 程序设计语言2、线性表的链式存储结构与顺序存储结构相比的优点是()。

(A) 所有的操作算法实现简单(B) 便于随机存取(C) 便于插入和删除操作的实现(D) 便于利用零散的存储器空间3、设10个元素进栈序列是1,2,…,10,其输出序列是a1,a2,…,a10,如果a1=3,则a2的值为()。

(A) 一定是2 (B) 一定是1(C) 不可能是4 (D) 不可能是14、设高度为h的二叉树上只有度为0和度为2的结点(假设仅含根结点的二叉树的高度为1),则此二叉树所包含的结点数至多有()。

(A) 2h-1 (B) 2h - 1(C) 2h+1 (D) 2h + 15、设有13个值,用它们组成一棵哈夫曼树,则该哈夫曼树共有()个结点。

(A) 13 (B) 12(C) 26 (D) 25二、填空题(每小题2分,共10分)1、把一个递归过程转换成一个等价的非递归过程,通常使用()。

2、数据的逻辑结构是从逻辑上描述数据,它与数据的()无关,是独立于计算机的。

3、在单链表中,结点与结点之间的逻辑关系不是通过存储单元的顺序来表示的,而是通过()来实现的。

4、实现动态分配和动态回收一个结点空间的两个标准过程是()和()。

三、名词解释(每小题5分,共10分)1、线性表2、哈希函数四、简答题(每小题5分,共10分)1、简述顺序表和链表的优缺点。

2、举例说明直接选择排序方法是一种不稳定的排序方法。

五、应用题(每小题6分,共30分)1、关键字序列{12,7,18,13,17,29,34,6,8}是否为堆?若不是,请将其调整为最小堆,并统计建堆过程中的交换次数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

假设二叉树采用二叉链存储结构存储,分别实现以下算法,并在程序中完成测试:(1)计算二叉树节点个数;
(2)输出所有叶子节点;
(3)求二叉树b的叶子节点个数;
(4)求二叉树b的宽度
#include<stdio.h>
#include<malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data; //数据元素
struct node *lchild; //指向左孩子
struct node *rchild; //指向右孩子
} BTNode;
void CreateBTNode(BTNode *&b,char *str); //由str串创建二叉链
BTNode *FindNode(BTNode *b,ElemType x); //返回data域为x的节点指针
BTNode *LchildNode(BTNode *p); //返回*p节点的左孩子节点指针
BTNode *RchildNode(BTNode *p); //返回*p节点的右孩子节点指针
int BTNodeDepth(BTNode *b); //求二叉树b的深度
void DispBTNode(BTNode *b); //以括号表示法输出二叉树
void DestroyBTNode(BTNode *&b); //销毁二叉树
void LevelOrder(BTNode *b)
{
BTNode *p;
BTNode *qu[MaxSize]; //定义环形队列,存放节点指针
int front,rear; //定义队头和队尾指针
front=rear=-1; //置队列为空队列
rear++;
qu[rear]=b; //根节点指针进入队列
while (front!=rear) //队列不为空
{
front=(front+1)%MaxSize;
p=qu[front]; //队头出队列
printf("%c ",p->data); //访问节点
if (p->lchild!=NULL) //有左孩子时将其进队
{
rear=(rear+1)%MaxSize;
qu[rear]=p->lchild;
}
if (p->rchild!=NULL) //有右孩子时将其进队
{
rear=(rear+1)%MaxSize;
qu[rear]=p->rchild;
}
}
}
void CreateBTNode(BTNode *&b,char *str) //由str串创建二叉链{
BTNode *St[MaxSize],*p=NULL;
int top=-1,k,j=0;
char ch;
b=NULL; //建立的二叉树初始时为空
ch=str[j];
while (ch!='\0') //str未扫描完时循环
{
switch(ch)
{
case'(':
top++;
St[top]=p;
k=1;
break; //为左节点
case')':
top--;
break;
case',':
k=2;
break; //为右节点
default:
p=(BTNode *)malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if (b==NULL) //p指向二叉树的根节点b=p;
else//已建立二叉树根节点 {
switch(k)
{
case 1:
St[top]->lchild=p;
break;
case 2:
St[top]->rchild=p;
break;
}
}
}
j++;
ch=str[j];
}
}
BTNode *FindNode(BTNode *b,ElemType x) //返回data域为x的节点指针{
BTNode *p;
if (b==NULL)
return NULL;
else if (b->data==x)
return b;
else
{
p=FindNode(b->lchild,x);
if (p!=NULL)
return p;
else
return FindNode(b->rchild,x);
}
}
BTNode *LchildNode(BTNode *p) //返回*p节点的左孩子节点指针
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p) //返回*p节点的右孩子节点指针
{
return p->rchild;
}
int BTNodeDepth(BTNode *b) //求二叉树b的深度
{
int lchilddep,rchilddep;
if (b==NULL)
return(0); //空树的高度为0 else
{
lchilddep=BTNodeDepth(b->lchild); //求左子树的高度为lchilddep rchilddep=BTNodeDepth(b->rchild); //求右子树的高度为rchilddep return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);
}
}
void DispBTNode(BTNode *b) //以括号表示法输出二叉树
{
if (b!=NULL)
{
printf("%c",b->data);
if (b->lchild!=NULL || b->rchild!=NULL)
{
printf("(");
DispBTNode(b->lchild);
if (b->rchild!=NULL) printf(",");
DispBTNode(b->rchild);
printf(")");
}
}
}
void DestroyBTNode(BTNode *&b) //销毁二叉树
{
if (b!=NULL)
{
DestroyBTNode(b->lchild);
DestroyBTNode(b->rchild);
free(b);
}
}
void PreOrder1(BTNode *b)
{
BTNode *St[MaxSize],*p;
int top=-1;
if (b!=NULL)
{
top++; //根节点入栈
St[top]=b;
while (top>-1) //栈不为空时循环
{
p=St[top]; //退栈并访问该节点
top--;
printf("%c ",p->data);
if (p->rchild!=NULL) //右孩子入栈 {
top++;
St[top]=p->rchild;
}
if (p->lchild!=NULL) //左孩子入栈 {
top++;
St[top]=p->lchild;
}
}
printf("\n");
}
}
void InOrder1(BTNode *b)
{
BTNode *St[MaxSize],*p;
int top=-1;
if (b!=NULL)
{
p=b;
while (top>-1 || p!=NULL)
{
while (p!=NULL)
{
top++;
St[top]=p;
p=p->lchild;
}
if (top>-1)
{
p=St[top];
top--;
printf("%c ",p->data);
p=p->rchild;
}
}
printf("\n");
}
}。

相关文档
最新文档