数据结构第六章实验

合集下载

数据结构(c语言)第6章二叉树课练答案(含完整实验程序刘玉保留

数据结构(c语言)第6章二叉树课练答案(含完整实验程序刘玉保留

第6章树和二叉树自测卷解答姓名班级一、下面是有关二叉树的叙述,请判断正误(每小题1分,共10分)(√)1. 若二叉树用二叉链表作存贮结构,则在n个结点的二叉树链表中只有n—1个非空指针域。

(×)2.二叉树中每个结点的两棵子树的高度差等于1。

(√)3.二叉树中每个结点的两棵子树是有序的。

(×)4.二叉树中每个结点有两棵非空子树或有两棵空子树。

(×)5.二叉树中每个结点的关键字值大于其左非空子树(若存在的话)所有结点的关键字值,且小于其右非空子树(若存在的话)所有结点的关键字值。

(应当是二叉排序树的特点)(×)6.二叉树中所有结点个数是2k-1-1,其中k是树的深度。

(应2i-1)(×)7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。

(×)8.对于一棵非空二叉树,它的根结点作为第一层,则它的第i层上最多能有2i—1个结点。

(应2i-1)(√)9.用二叉链表法(link-rlink)存储包含n个结点的二叉树,结点的2n个指针区域中有n+1个为空指针。

(正确。

用二叉链表存储包含n个结点的二叉树,结点共有2n个链域。

由于二叉树中,除根结点外,每一个结点有且仅有一个双亲,所以只有n-1个结点的链域存放指向非空子女结点的指针,还有n+1个空指针。

)即有后继链接的指针仅n-1个。

(√)10. 〖01年计算机系研题〗具有12个结点的完全二叉树有5个度为2的结点。

最快方法:用叶子数=[n/2]=6,再求n2=n0-1=5二、填空(每空1分,共15分)1.由3个结点所构成的二叉树有5种形态。

2. 【计算机研2000】一棵深度为6的满二叉树有n1+n2=0+ n2= n0-1=31 个分支结点和26-1 =32个叶子。

注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。

3.一棵具有257个结点的完全二叉树,它的深度为9。

(注:用⎣ log2(n) ⎦+1= ⎣ 8.xx ⎦+1=94.【全国专升本统考题】设一棵完全二叉树有700个结点,则共有350个叶子结点。

数据结构(CC++语言版)第六章new

数据结构(CC++语言版)第六章new
为简单路径。
回路 若路径上第一个顶点 v1 与最后一个顶点vm 重合, 则称这样的路径
为回路或环。
路径长度
非带权图的路径长度是指此路径上边的条数。 带权图的路径长度是指路径上各边的权之和。
▪图的连通 在无向图G中,若两个顶点vi和vj之间有 路径存在,则称vi 和vj 是连通的。若G中任意两 个顶点都是连通的,则称G为连通图。非连通图的 极大连通子图叫做连通分量。
5 9
1
12
63
8
15
76
6
3
4
16
7
60
A
B 40 80 C
30
75
35
D
E
45
▪子图 设有两个图 G=(V, E) 和 G‘=(V’, E‘)。若 V’ V 且 E‘E, 则称 图G’ 是 图G 的子图。
路径 在图 G=(V, E) 中, 若从顶点 vi 出发, 沿一些边经过一些顶点 vp1,
种带权图叫做网。
▪生成树 一个连通图的生成树是它的极小 连通子图,在n个顶点的情形下,有n-1条 边。生成森林
不予讨论的图 包含顶点到其自身的边; 一条边在图中重复出现
6.2 图的存储结构
一. 图的数组表示法 (邻接矩阵表示法)
基本思想:
✓ 图需要存储的信息:顶点和弧。 ✓ 引入两个数组,一个记录各个顶点信息的顶点表,还
有一个表示各个顶点之间关系的邻接矩阵。
设图 A = (V, E)是一个有 n 个顶点的图,则图的 邻接矩阵是一个二维数组 A.arcs[n][n],定义:
1 arcs[i][j] = 0
若<vi, vj> 或 (vi, vj) E 反之
2
1

《数据结构(C语言版 第2版)》(严蔚敏 著)第六章练习题答案

《数据结构(C语言版 第2版)》(严蔚敏 著)第六章练习题答案

《数据结构(C语言版第2版)》(严蔚敏著)第六章练习题答案第6章图1.选择题(1)在一个图中,所有顶点的度数之和等于图的边数的()倍。

A.1/2B.1C.2D.4答案:C(2)在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的()倍。

A.1/2B.1C.2D.4答案:B解释:有向图所有顶点入度之和等于所有顶点出度之和。

(3)具有n个顶点的有向图最多有()条边。

A.n B.n(n-1)C.n(n+1)D.n2答案:B解释:有向图的边有方向之分,即为从n个顶点中选取2个顶点有序排列,结果为n(n-1)。

(4)n个顶点的连通图用邻接距阵表示时,该距阵至少有()个非零元素。

A.n B.2(n-1)C.n/2D.n2答案:B所谓连通图一定是无向图,有向的叫做强连通图连通n个顶点,至少只需要n-1条边就可以了,或者说就是生成树由于无向图的每条边同时关联两个顶点,因此邻接矩阵中每条边被存储了两次(也就是说是对称矩阵),因此至少有2(n-1)个非零元素(5)G是一个非连通无向图,共有28条边,则该图至少有()个顶点。

A.7B.8C.9D.10答案:C解释:8个顶点的无向图最多有8*7/2=28条边,再添加一个点即构成非连通无向图,故至少有9个顶点。

(6)若从无向图的任意一个顶点出发进行一次深度优先搜索可以访问图中所有的顶点,则该图一定是()图。

A.非连通B.连通C.强连通D.有向答案:B解释:即从该无向图任意一个顶点出发有到各个顶点的路径,所以该无向图是连通图。

(7)下面()算法适合构造一个稠密图G的最小生成树。

A.Prim算法B.Kruskal算法C.Floyd算法D.Dijkstra算法答案:A解释:Prim算法适合构造一个稠密图G的最小生成树,Kruskal算法适合构造一个稀疏图G的最小生成树。

(8)用邻接表表示图进行广度优先遍历时,通常借助()来实现算法。

A.栈 B.队列 C.树D.图答案:B解释:广度优先遍历通常借助队列来实现算法,深度优先遍历通常借助栈来实现算法。

数据结构实验6报告

数据结构实验6报告

数据结构实验报告第 6 次实验一、实验目的1.理解栈是操作受限(插入push, 删除pop)的线性表, 受限的是插入删除的位置。

2.在链式存储结构下实现:StackEmpty, Push,Pop, 几个基本操作。

3.通过调用基本操作实现括号匹配算法。

二、实验内容(问题)写一个算法, 识别依次读入的一个字符序列是否为形如‘序列1&序列2’模式的字符序列。

其中序列1和序列2中都不含字符‘&’, 且序列2是序列1的逆序列。

例如, ‘a+b&b+a’是属该模式的字符序列, 而’1+3&3-1’则不是。

测试数据: ’1+3&3-1’; ’a+b+c&c+b+a’; ’a+b+c&c+b’; ’b+c&c+b+a’;提示:利用栈 , 利用已实现的基本操作三、算法描述(给出自然语言描述的算法)1.向后依次扫描字符序列, 如果考察的字符不等于‘&’则入栈, 遇到‘&’则停止。

2.从‘&’后继续扫描, 考察字符的时候, 栈顶元素出栈, 若二者相等, 继续扫描;不等, 模式不成立。

3.扫描结束后, 栈空则模式成立四、详细设计(画流程图)五、程序代码#include<stdio.h>#include<stdlib.h>#define True 1#define False 0#define OK 1#define ERROR 0typedef int status;typedef char ElemType;typedef struct SNode{ElemType data;struct SNode *next;}SNode, *LinkStack;status InitStack(LinkStack &S);int StackEmpty(LinkStack S);status Push(LinkStack &S, ElemType e);status Pop(LinkStack &S, ElemType &e);status Is_Match(ElemType f[20]);main(){ElemType formula[20];int i;for(i=0;i<=3;i++){printf("\n请输入一个字符序列表达式: ");scanf("%s",formula);if(Is_Match(formula)==1) printf(" \n这个表达式符合‘序列1&序列2’模式!\n"); else printf("\n 这个表达式不符合‘序列1&序列2’模式!\n");}return(1);}status InitStack(LinkStack &S){S=NULL;return(OK);}int StackEmpty(LinkStack S){if(S==NULL) return(True);else return(False);}status Push(LinkStack &S, ElemType e){LinkStack p;p=(LinkStack)malloc(sizeof(SNode));if(!p) return(ERROR);p->data=e;p->next=S;S=p;return(OK);}status Pop(LinkStack &S, ElemType &e){LinkStack p;if(!S) return(ERROR);e=S->data;p=S;S=S->next;free(p);return(OK);}status Is_Match(ElemType f[20]){LinkStack St; ElemType *p,c;InitStack(St);p=f;for(;*p!='&';p++){ Push(St,*p);if(!Push(St, *p)) return(ERROR);}p++;for(;*p!='\0';p++){Pop(St,c);if(!Pop(St,c)) return(ERROR);else if(c!=*p) return(ERROR);}if(StackEmpty(St)) return(OK);else return(ERROR);}七、用户手册(教用户怎么用这个程序)用途: 判断字符串是否是“序列1&序列2’模式”用法:启动此程序, 屏幕会提示你输入数据, 输入数据并按下回车键即可。

数据结构 第六章 树和二叉树作业及答案

数据结构 第六章 树和二叉树作业及答案

第六章树和二叉树作业一、选择题(每题2分,共24分)。

1. 一棵二叉树的顺序存储情况如下:树中,度为2的结点数为( C )。

A.1 B.2 C.3 D.42. 一棵“完全二叉树”结点数为25,高度为(B )。

A.4 B.5 C.6 D.不确定3.下列说法中,(B )是正确的。

A. 二叉树就是度为2的树B. 二叉树中不存在度大于2的结点C. 二叉树是有序树D. 二叉树中每个结点的度均为24.一棵二叉树的前序遍历序列为ABCDEFG,它的中序遍历序列可能是(B )。

A. CABDEFGB. BCDAEFGC. DACEFBGD. ADBCFEG5.线索二叉树中的线索指的是(C )。

A.左孩子 B.遍历 C.指针 D.标志6. 建立线索二叉树的目的是(A )。

A. 方便查找某结点的前驱或后继B. 方便二叉树的插入与删除C. 方便查找某结点的双亲D. 使二叉树的遍历结果唯一7. 有 D )示意。

A.B.C.D.8. 一颗有2046个结点的完全二叉树的第10层上共有(B )个结点。

A. 511B. 512C. 1023D. 10249. 一棵完全二叉树一定是一棵(A )。

A. 平衡二叉树B. 二叉排序树C. 堆D. 哈夫曼树10.某二叉树的中序遍历序列和后序遍历序列正好相反,则该二叉树一定是( C )的二叉树。

A .空或只有一个结点B .高度等于其结点数C .任一结点无左孩子D .任一结点无右孩子11.一棵二叉树的顺序存储情况如下:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15A B C D E 0 F 0 0 G H 0 0 0 X结点D 的左孩子结点为( D )。

A .EB .C C .FD .没有12.一棵“完全二叉树”结点数为25,高度为( B )。

A .4B .5C .6D .不确定二、填空题(每空3分,共18分)。

1. 树的路径长度:是从树根到每个结点的路径长度之和。

对结点数相同的树来说,路径长度最短的是 完全 二叉树。

数据结构课程实验报告(6)

数据结构课程实验报告(6)

课程实验报告课程名称:数据结构专业班级:信息安全1302学号:姓名:指导教师:报告日期:计算机科学与技术学院目录1 课程实验概述 (3)2 实验一基于顺序结构的线性表实现2.1 问题描述 (3)2.2 系统设计 (3)2.3 系统实现 (8)2.4 效率分析 (10)3 实验二基于链式结构的线性表实现3.1 问题描述 (11)3.2 系统设计 (11)3.3 系统实现 (16)3.4 效率分析 (18)4 实验三基于二叉链表的二叉树实现4.1 问题描述 (19)4.2 系统设计 (19)4.3 系统实现 (30)4.4 效率分析 (35)5 实验总结与评价 (36)1课程实验概述本课程实验基于数据结构课程的理论知识。

要求我们用C语言实现顺序结构线性表,链式结构顺序表以及二叉树结构的链式表三种数据结构,并实现它们相应的基本操作。

通过本实验,我们可以比较这三种数据结构的相似之处,区别以及应用场景,在以后处理问题时可以根据不同的情况采用不同的数据结构,本实验加强了我们编写代码的能力,加深了我们对数据结构的理解,下面将分成三部分依次介绍基于顺序结构的线性表实现,基于链式结构的线性表实现以及基于二叉链表的二叉树实现。

2 实验一基于顺序结构的线性表实现2.1 问题描述基于顺序存储结构,实现线性表的基本的,常见的运算(1)提供一个实现功能的演示系统;(2)具体物理结构和数据元素类型自行选定;2.2 系统设计2.2.1 总括本系统共实现了顺序线性表的13种基本操作,开始先定义了一个顺序表结构体:typedef struct{ElemType * elem;int length;int listsize;}SqList;其中定义了一个ElemType类型的数组,用来存放数据,表的长度由length存储,表的最大大小用listsize存储。

接下来声明了13个基本操作函数,在main函数中编写了一个简单的功能系统界面,用户在使用时可以输入序号来调用各个函数。

数据结构第六章二叉树的应用教案

数据结构第六章二叉树的应用教案

6.3 哈夫曼树
• • 最优树的定义 如何构造最优树
6.3.1 基本术语
路径和路径长度
若在一棵树中存在着一个结点序列 k1,k2,…,kj,使得ki是ki+1的 双亲(1≤i<j),则称此结点序列是 从k1到kj的路径从k1到kj所经过的 分支数称为这两点之间的路径长度
结点的权和带权路径长度
权 给结点赋上一个有某种意义 的实数,我们称为权。 带权路径长度 从根结点到该结点之间路径 长度与该结点上权的乘积。
23 设 key = 48
T
20 10 T 23 T 25
T T
30
T
40 35 T
bool Find(BTreeNode* T, ElemType& item) if(T==NULL) return false; //查找失败 else { if(item==T->data) { item=T->data; return true; } else if(item<T->data) //向左子树继续查找 return Find(T->left, item); else return Find(T->right, item); } //向右子树继续查找
ri r2i ri r2i 1
(小顶堆)

ri r2i ri r2i 1
(大顶堆)
12, 36, 27, 65, 40, 34, 98, 81, 73, 55, 49
是小顶堆
12, 36, 27, 65, 40, 14, 98, 81, 73, 55, 49
不是堆
子树上查找;
3)大于根结点的关键字,则继续在右
子树上查找。

数据结构(C语言版) 实验报告

数据结构(C语言版) 实验报告

数据结构(C语言版) 实验报告数据结构(C语言版) 实验报告第一章引言本实验报告主要介绍了在C语言环境下进行数据结构实验的相关内容。

数据结构是计算机科学中最基础的一门课程,它主要涉及到如何将数据组织和存储以便高效地访问和操作。

本实验报告将按照以下章节进行详细介绍。

第二章实验目的本实验的主要目的是通过实践操作,加深对数据结构的理解,并运用C语言编写相应的数据结构代码。

第三章实验环境1.操作系统:________Windows 102.编程语言:________C语言3.开发工具:________Visual Studio Code第四章实验内容1.线性表1.1 顺序表的实现1.1.1 初始化线性表1.1.2 插入操作1.1.3 删除操作1.1.4 查找操作1.2 链表的实现1.2.1 单链表的创建和遍历1.2.2 单链表的插入和删除操作 1.2.3 单链表的反转1.3 栈1.3.1 栈的实现1.3.2 栈的应用1.4 队列1.4.1 队列的实现1.4.2 队列的应用2.树2.1 二叉树的实现2.1.1 二叉树的创建和遍历2.1.2 二叉树的查找操作2.1.3 二叉树的插入和删除操作2.2 平衡二叉树2.2.1 平衡二叉树的实现2.2.2 平衡二叉树的插入和删除操作 2.3 堆2.3.1 堆的实现2.3.2 堆的操作2.4 哈夫曼树2.4.1 哈夫曼树的构建2.4.2 哈夫曼编码和解码3.图3.1 图的表示方法3.1.1 邻接矩阵3.1.2 邻接表3.2 图的遍历算法3.2.1 深度优先搜索(DFS)3.2.2 广度优先搜索(BFS)3.3 最小树3.3.1 Kruskal算法3.3.2 Prim算法3.4 最短路径3.4.1 Dijkstra算法3.4.2 Floyd算法第五章实验结果本实验通过编写相关的数据结构代码和算法,成功实现了线性表、树和图的基本功能。

经测试,各功能模块能正常运行,并能给出正确的结果。

数据结构 第六章测验 测验答案 慕课答案 UOOC优课 课后练习 深圳大学

数据结构 第六章测验 测验答案 慕课答案 UOOC优课 课后练习 深圳大学

数据结构第六章测验一、单选题 (共100.00分)1. 树的存储结构不包括()A. 祖先表示法B. 双亲表示法C. 孩子表示法D. 孩子兄弟表示法正确答案:A2. 二叉树的深度为8,则该二叉树最多有()个结点A. 15B. 16C. 255D. 256正确答案:C3. 已知二叉树有11个结点,其中4个结点是有一个孩子,叶子有()个A. 4B. 5C. 6D. 3正确答案:A4. 已知A是二叉树根结点,B、C分别是A的左右孩子,D是B的左孩子,E是C的右孩子,F是D的右孩子,则该二叉树的中序遍历序列是()A. FDBECAB. DFBACEC. ABDFCED. ABCDEF正确答案:B5. 赫夫曼树是指()A. 路径长度最大的树B. 路径长度和最小的树C. 带权路径长度和最大的二叉树D. 带权路径长度和最小的二叉树正确答案:D6. 为了避免重复遍历在二叉树中保存前驱后继信息,这种二叉树称为()A. 遍历二叉树B. 完全二叉树C. 满二叉树D. 线索二叉树正确答案:D7. 已知一棵完全二叉树有20个结点,从1开始按层次遍历编号,则结点8的孩子编号是()A. 左孩子编号4,右孩子编号5B. 左孩子编号9,右孩子编号10C. 左孩子编号16,右孩子编号17D. 左孩子编号20,右孩子不存在正确答案:C8. 在二叉树中C是D的右孩子,在先序遍历序列中C在D的()A. 前面B. 后面C. 不好说D. 并列正确答案:B9. 二叉树的第4层最多有()个结点A. 4B. 6C. 8D. 16正确答案:C10. 二叉树的中序遍历序列中,结点P排在结点Q之前的条件是()A. 在二叉树中P在Q的左边B. 在二叉树中P在Q的右边C. 在二叉树中P是Q的祖先D. 在二叉树中P是Q的子孙正确答案:A。

数据结构-使用C语言 朱战立 第6章递归

数据结构-使用C语言 朱战立 第6章递归
17
6.7设计举例
6.7.1 一般递归算法设计举例
例6-5 设计一个输出如下形式数值的递归算法。 n n n ... n
...... 3 2 1 3 2 3
18
问题分析:该问题可以看成由两部分组成:一部分是输出一 行值为n的数值;另一部分是原问题的子问题,其参数为n-1。 当参数减到0时不再输出任何数据值,因此递归的出口是当参 数n≤0时空语句返回。
( 3 )分析当调用语句为 Gcd(97, 5) 时算法的 执行过程和执行结果;
(4)编写求解该问题的循环结构算法。
23
解:
递归算法如下: int Gcd(int n, int m) { if(n < 0 || m < 0) exit(0); if(m == 0) return n; else if(m > n) return Gcd(m, n); else return Gcd(m, n % m); }
7
递归算法如下:
int BSearch(int a[], int x, int low, int high) { int mid; if(low > high) return -1; mid = (low + high) / 2; if(x == a[mid]) return mid; else if(x < a[mid]) return BSearch(a, x, low, mid-1); /*在下半区查找*/ else return BSearch(a, x, mid+1, high); } /*在上半区查找*/ /*查找成功*/ /*查找不成功*/
Move Disk 2 from Peg A to Peg C
Move Disk 1 from Peg B to Peg C

数据结构课后习题答案第六章

数据结构课后习题答案第六章

所以
n=n1+2×n2+…+m×nm+1 由(1)(2)可知 n0= n2+2×n3+3×n4+…+(m-1) ×nm+1
(2)
八、证明:一棵满 K 叉树上的叶子结点数 n0 和非叶子结点数 n1 之间满足以下关 系:n0=(k-1)n1+1。 证明:n=n0+n1
n=n1k+1 由上述式子可以推出 n0=(k-1)n1+1 十五、请对右图所示的二叉树进行后序线索化,为每个空指针建立相应的前驱或 后继线索。
四十三、编写一递归算法,将二叉树中的所有结点的左、右子树相互交换。 【分析】 依题意,设 t 为一棵用二叉链表存储的二叉树,则交换各结点的左右子树的
运算基于后序遍历实现:交换左子树上各结点的左右子树;交换右子树上各结点 的左右子树;再交换根结点的左右子树。
【算法】 void Exchg(BiTree *t){ BinNode *p; if (t){ Exchg(&((*t)->lchild)); Exchg(&((*t)->rchild)); P=(*t)->lchild; (*t)->lchild=(*t)->rchild; (*t)->rchild=p; } }
(4)编号为 i 的结点的有右兄弟的条件是什么? 其右兄弟的编号是多少? 解:
(1) 层号为 h 的结点数目为 kh-1 (2) 编号为 i 的结点的双亲结点的编号是:|_ (i-2)/k _|+1(不大于(i-2)/k 的最大整数。也就是(i-2)与 k 整除的结果.以下/表示整除。 (3) 编号为 i 的结点的第 j 个孩子结点编号是:k*(i-1)+1+j; (4) 编号为 i 的结点有右兄弟的条件是(i-1)能被 k 整除

数据结构第六章作业及答案

数据结构第六章作业及答案
1
3、试分别画出具有3个结点的树和3个结点的二叉树 的所有不同形态。 4、对右图所示的二叉树求出 A 以下的遍历序列: B C (1)先序序列 D E F (2)中序序列 (3)后序序列 G H 5、假设一棵二叉树的先序序列为 EBADCFHGIKJ 和 中序序列为 ABCDEFGHIJK。请画出该树,并给 出后序序列。 6、假设一棵二叉树的中序序列为 DCBGEAHFIJK和 后序序列为 DCEGBFHKJIA 。请画出该树,并给 出先序序列。
2
7、将以下森林转换成二叉树。
A
B
C
D
E F G J I
H
L K
3
8、画出和下列二叉树相应的森林。
(a)
A
(b) (c)
A B C
(d)
A B C B C D B
(e)
A
C E F
A
G
J
H
K M
I
4
第六章作业解答 1、(1) M、N、D、L、F、J、K是叶子结点
(2) C是结点G的双亲 (3) A、C是结点G的祖先 (4) I、M、N是结点E的子孙 (5) 树的深度是5 2、(1)二叉树与树的区别: 二叉树的一个结点至多有2个子树,树则不然; 二叉树的一个结点有左、右之分,而树则没有此要求 (2)一棵度为2的树有2个分支,没有左、右之分, 一棵二叉树也可以有2个分支,但有左、右之分, 且左、右不能交换。 3、具有3个结点的树的形态为:
C D
E
F
K
7
7、解:转换后的二叉树为:
A B C D E F G J K I L H
8
8、解:转换后的森林为: (a) (b) (c)
A A B A B C

数据结构实验内容

数据结构实验内容
验题目:线性表及其应用 实验题目: 2. 内容要求: 内容要求: (1) 顺序表的创建、置逆、遍历。 顺序表的创建、置逆、遍历。 (2) 链表的创建、置逆、遍历。 链表的创建、置逆、遍历。 (3) 线性表的应用。 线性表的应用。 3. 课时目的:掌握线性表的两种不同的存储 课时目的: 结构。 结构。
《数据结构》实验内容 数据结构》
实验一:顺序表的创建、逆置、 实验一:顺序表的创建、逆置、遍历 实验二:单链表的创建、逆置、 实验二:单链表的创建、逆置、遍历 实验三: 实验三:线性表的应用 --一元多项式的加法运算 --一元多项式的加法运算 实验四:利用顺序栈/ 实验四:利用顺序栈/链栈完成表达式求值 实验五:串的模式匹配(选做) 实验五:串的模式匹配(选做) 实验六: 实验六:二叉树的创建及遍历 实验七: 实验七:多种简单排序方法的应用 实验八:哈希表的创建、 实验八:哈希表的创建、查找
实验四
1. 实验题目: 实验题目: 利用顺序栈/链栈完成表达式求值 利用顺序栈 链栈完成表达式求值 2. 内容要求: 内容要求: (1) 利用顺序栈完成表达式求值。 利用顺序栈完成表达式求值。 (2) 利用链栈完成表达式求值。 利用链栈完成表达式求值。 3. 课时目的:掌握表达式求值的内部算法机 课时目的: 理。

数据结构 第六章 树和二叉树

数据结构 第六章  树和二叉树

F
G
H
M
I
J
结点F,G为堂兄弟 结点A是结点F,G的祖先
5
树的基本操作
树的应用很广,应用不同基本操作也不同。下面列举了树的一些基本操作: 1)InitTree(&T); 2)DestroyTree(&T); 3)CreateTree(&T, definition); 4)ClearTree(&T); 5)TreeEmpty(T); 6)TreeDepth(T); 7) Root(T); 8) Value(T, &cur_e); 9) Assign(T, cur_e, value); 10)Paret(T, cur_e); 11)LeftChild(T, cur_e); 12)RightSibling(T, cur_e); 13)InsertChild(&T, &p, i, c); 14)DeleteChild(&T,&p, i); 15)TraverseTree(T, Visit( ));
1
2 4 8 9 10 5 11 12 6 13 14 3 7 15 4 6 2
1
3
5 7
证明:设二叉树中度为1的结点个数为n1 根据二叉树的定义可知,该二叉树的结点数n=n0+n1+n2
又因为在二叉树中,度为0的结点没有孩子,度为1的结点有1 个孩子,度为2的结点有2个结孩子,故该二叉树的孩子结点 数为 n0*0+n1*1+n2*2(分支数) 而一棵二叉树中,除根结点外所有都为孩子结点,故该二叉 树的结点数应为孩子结点数加1即:n=n0*0+n1*1+n2*2+1
文件夹1
文件夹n

数据结构课后习题及解析第六章

数据结构课后习题及解析第六章

第六章习题1.试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。

2.对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。

3.已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,……,n k个度为k的结点,则该树中有多少个叶子结点并证明之。

4.假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。

5.已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个6.给出满足下列条件的所有二叉树:①前序和后序相同②中序和后序相同③前序和后序相同$7.n个结点的K叉树,若用具有k个child域的等长链结点存储树的一个结点,则空的Child域有多少个8.画出与下列已知序列对应的树T:树的先根次序访问序列为GFKDAIEBCHJ;树的后根次序访问序列为DIAEKFCJHBG。

9.假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:,,,,,,,请为这8个字母设计哈夫曼编码。

10.已知二叉树采用二叉链表存放,要求返回二叉树T的后序序列中的第一个结点指针,是否可不用递归且不用栈来完成请简述原因.11. 画出和下列树对应的二叉树:!12.已知二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目。

13.编写递归算法:对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。

14.分别写函数完成:在先序线索二叉树T中,查找给定结点*p在先序序列中的后继。

在后序线索二叉树T中,查找给定结点*p在后序序列中的前驱。

15.分别写出算法,实现在中序线索二叉树中查找给定结点*p在中序序列中的前驱与后继。

16.编写算法,对一棵以孩子-兄弟链表表示的树统计其叶子的个数。

17.对以孩子-兄弟链表表示的树编写计算树的深度的算法。

18.已知二叉树按照二叉链表方式存储,利用栈的基本操作写出后序遍历非递归的算法。

19.设二叉树按二叉链表存放,写算法判别一棵二叉树是否是一棵正则二叉树。

国家开放大学《数据结构》课程实验报告(实验6——查找)参考答案

国家开放大学《数据结构》课程实验报告(实验6——查找)参考答案
}
/*按平均成绩进行折半查找并插入新记录,使表仍按平均成绩降序排列*/
int BinSort(Student *a,int n,Student x)
{
int low,high,mid;
int i,j;
/*折半查找*/
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
void main()
{
Student a[N]={{"Zhao",95},{"Qian",90},{"Sun",86},{"Li",75}},x;
int n=4; /*学生人数,即表长*/
printf("初始%d位学生的信息表如下:\n",n);
Display(a,n);
printf("\n\n");
《数据结构》课程实验报告
(实验6——查找)
学生姓名
学 号
班 级
指导老师
实验名称
实验成绩
实验报告




实验目的:
某班学生成绩信息表中,每个学生的记录已按平均成绩由高到低排好序,后来发现某个学生的成绩没有登记到信息表中,使用折半查找法把该同学的记录插入到信息表中,使信息表中的记录仍按平均成绩有序。
实验要求:
(1)建立现有学生信息表,平均成绩已有序。
(2)输入插入学生的记录信息。
(3)用折半查找找到插入位置,并插入记录。
设计思路:
(1)用结构数组存储成绩信息表。
(2)对记录中的平均成绩进行折半查找并插入。
实验内容源自程序代码:/*实验5.1折半查找*/

数据结构 第6章习题

数据结构 第6章习题

习题1.对于如图6-21所示的二叉树,试给出:(1)它的顺序存储结构示意图。

(2)它的二叉链表存储结构示意图。

(3)它的三叉链表存储结构示意图。

图6-21 题1图2.证明:在结点数多于1的哈夫曼树中不存在度为1的结点。

3.证明:若哈夫曼树中有n个叶结点,则树中共有2n-1个结点。

4.证明:由二叉树的前序序列和中序序列可以唯一地确定一棵二叉树。

5.已知一棵度为m的树中有n1个度为1的结点,n2个度为2的结点,……,n m个度为m 的结点,问该树中共有多少个叶子结点?有多少个非终端结点?6.设高度为h的二叉树上只有度为0和度为2的结点,问该二叉树的结点数可能达到的最大值和最小值。

7.求表达式(a+b*(c-d))-e/f的波兰式(前缀式)和逆波兰式(后缀式)。

8.画出和下列已知序列对应的二叉树。

(1)二叉树的先序次序访问序列为:GFKDAIEBCHJ。

(2)二叉树的中序访问次序为:DIAEKFCJHBG。

9.画出和下列已知序列对应的二叉树。

(1)二叉树的后序次序访问序列为:CFEGDBJLKIHA。

(2)二叉树的中序访问次序为:CBEFDGAJIKLH。

10.画出和下列已知序列对应的二叉树。

(1)二叉树的层次序列为:ABCDEFGHIJ。

(2)二叉树的中序次序为:DBGEHJACIF。

11.给定一棵用二叉链表表示的二叉树,其根指针为root。

试写出求二叉树结点的数目的算法(递归算法或非递归算法)。

12.设计一个算法,要求该算法把二叉树的叶结点按从左至右的顺序链成一个单链表。

二叉树按二叉链表方式存储,链接时用叶结点的rchild域存放链指针。

13.给定一棵用二叉链表表示的二叉树,其根指针为root。

试写出求二叉树的深度的算法。

14.给定一棵用二叉链表表示的二叉树,其根指针为root。

试写出求二叉树各结点的层数的算法。

15.给定一棵用二叉链表表示的二叉树,其根指针为root。

试写出将二叉树中所有结点的左、右子树相互交换的算法。

数据结构详细教案——树与二叉树

数据结构详细教案——树与二叉树

数据结构教案第六章树与二叉树目录6.1树的定义和基本术语 (1)6.2二叉树 (2)6.2.1 二叉树的定义 (2)6.2.2 二叉树的性质 (4)6.2.3 二叉树的存储结构 (5)6.3树和森林 (6)6.4二叉树的先|中|后序遍历算法 (7)6.5先|后|中序遍历的应用扩展 (9)6.5.1 基于先序遍历的二叉树(二叉链)的创建 (9)6.5.2 统计二叉树中叶子结点的数目 (9)6.5.3 求二叉树的高度 (10)6.5.4 释放二叉树的所有结点空间 (11)6.5.5 删除并释放二叉树中以元素值为x的结点作为根的各子树 (12)6.5.6 求位于二叉树先序序列中第k个位置的结点的值 (12)6.5.7 线索二叉树 (13)6.5.8 树和森林的遍历 (14)6.6二叉树的层次遍历 (16)6.7判断一棵二叉树是否为完全二叉树 (16)6.8哈夫曼树及其应用 (18)6.8.1 最优二叉树(哈夫曼树) (18)6.8.2 哈夫曼编码 (19)6.9遍历二叉树的非递归算法 (19)6.9.1 先序非递归算法 (19)6.9.2 中序非递归算法 (20)6.9.3 后序非递归算法 (21)第6章二叉树和树6.1 树的定义和基本术语1、树的递归定义1)结点数n=0时,是空树2)结点数n>0时有且仅有一个根结点、m个互不相交的有限结点集——m棵子树2、基本术语结点:叶子(终端结点)、根、内部结点(非终端结点、分支结点);树的规模:结点的度、树的度、结点的层次、树的高度(深度)结点间的关系:双亲(1)—孩子(m),祖先—子孙,兄弟,堂兄弟兄弟间是否存在次序:无序树、有序树去掉根结点非空树森林引入一个根结点3、树的抽象数据类型定义树特有的操作:查找:双亲、最左的孩子、右兄弟结点的度不定,给出这两种操作可以查找到一个结点的全部孩子插入、删除:孩子遍历:存在一对多的关系,给出一种有规律的方法遍历(有且仅访问一次)树中的结点ADT Tree{数据对象:D={a i | a i∈ElemSet, i=1,2,…,n, n≥0}数据关系:若D为空集,则称为空树;若D仅含一个数据元素,则R为空集,否则R={H},H是如下二元关系:(1) 在D中存在唯一的称为根的数据元素root,它在关系H下无前驱;(2) 若D-{root}≠Ф,则存在D-{root}的一个划分D1, D2, …, D m (m>0)(D i 表示构成第i棵子树的结点集),对任意j≠k (1≤j, k≤m) 有D j∩D k=Ф,且对任意的i (1≤i≤m),唯一存在数据元素x i∈D i, 有<root,x i>∈H(H表示结点之间的父子关系);(3) 对应于D-{root}的划分,H-{<root, x1>,…, <root, x m>}有唯一的一个划分H1, H2, …, H m(m>0)(H i表示第i棵子树中的父子关系),对任意j≠k(1≤j,k≤m)有H j∩H k=Ф,且对任意i(1≤i≤m),H i是D i上的二元关系,(D i, {H i})是一棵符合本定义的树,称为根root的子树。

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

#include<iostream.h>#include<stdlib.h>#include<string.h>typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char * *HuffmanCode;/*void Select(HuffmanTree &HT,int n,int &s1,int &s2) {s1=1;int j;for(j=1;j<=n;j++){while(HT[j].parent==0){if(HT[s1].weight>HT[j].weight)s1=j;}}HT[s1].parent=1;if(s1!=1)s2=1;else s2=2;for( j=1;j<=n;j++){while(HT[j].parent==0){if(HT[s2].weight>HT[j].weight)s2=j;}}}错误,未查出原因*/int min(HuffmanTree t,int i){int j,flag;unsigned int k;for(j=1;j<=i;j++)if(t[j].weight<k&&t[j].parent==0)k=t[j].weight,flag=j;t[flag].parent=1;return flag;}void Select(HuffmanTree t,int i,int &s1,int &s2){ // s1为最小的两个值中序号小的那个int j;s1=min(t,i);s2=min(t,i);if(s1>s2){j=s1;s1=s2;s2=j;}}void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){ int m,i,start,t1,t2;unsigned int c,f;char *cd;if(n<=1){cout<<"Error!"<<endl;}m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));for(i=1;i<=n;i++){HT[i].weight=w[i-1];HT[i].parent=0;HT[i].lchild=0;HT[i].rchild=0;}for(;i<=m;i++)HT[i].parent=0;for(i=n+1;i<=m;++i){Select(HT,i-1,t1,t2);HT[t1].parent=i;HT[t2].parent=i;HT[i].lchild=t1;HT[i].rchild=t2;HT[i].weight=HT[t1].weight+HT[t2].weight;}HC=(HuffmanCode)malloc((n+1)*sizeof(char *));cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;++i){start=n-1;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)if(HT[f].lchild==c) cd[--start]='0';else cd[--start]='1';HC[i]=(char *)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);}free(cd);}void main(){HuffmanTree HT;HuffmanCode HC;int i,n,*w;cout<<"请输入赫夫曼的字符个数:"<<endl;cin>>n;w=(int *)malloc(n*sizeof(int));cout<<"请输入赫夫曼字符权值:"<<endl;for(i=0;i<n;i++){cin>>*(w+i);}cout<<"执行赫夫曼树和赫夫曼编码"<<endl;HuffmanCoding(HT,HC,w,n);cout<<"输出赫夫曼树储存数据:"<<endl;for(i=1;i<=2*n-1;i++){cout<<HT[i].weight<<" "<<HT[i].parent<<" "<<HT[i].lchild<<" "<<HT[i].rchild<<endl;}cout<<"输出赫夫曼编码"<<endl;for(i=1;i<=n;i++){cout<<HC[i]<<endl;}}#include<iostream.h>#include<stdlib.h>#include<string.h>typedef struct{int weight;int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char * *HuffmanCode;typedef char *Huffman;void Select(HuffmanTree &HT,int n,int &s1,int &s2) {s1=1;s2=1;int j;for(j=1;j<=n;j++){while(!HT[j].parent){if(HT[s1].weight>HT[j].weight)s1=j;}}HT[s1].parent=1;for( j=1;j<=n;j++){while(!HT[j].parent){if(HT[s2].weight>HT[j].weight)s2=j;}}}void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){ int m,i,start,c,f,s1,s2;Huffman cd;HuffmanTree p;if(n<=1){cout<<"Error!"<<endl;exit(0);}m=2*n-1;HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));for(p=HT+1,i=1;i<=n;++i,++p,++w){p->weight=*w;p->parent=0;p->lchild=0;p->rchild=0;}for(;i<=m;++i,++p){p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;}for(i=n+1;i<=m;++i){Select(HT,i-1,s1,s2);HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;HT[i].weight=HT[s1].weight+HT[s2].weight;}HC=(HuffmanCode)malloc((n+1)*sizeof(char *));cd=(char *)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;++i){start=n-1;for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)if(HT[f].lchild==c) cd[--start]=0;else cd[--start]=1;HC[i]=(char *)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);}}void main(){HuffmanTree HT;HuffmanCode HC;int i,n,*w,a[100]={0};w=a;cout<<"请输入赫夫曼的字符个数:"<<endl;cin>>n;cout<<endl<<"请输入赫夫曼字符:"<<endl;for(i=0;i<n;i++){cin>>a[i];}cout<<endl<<"执行赫夫曼树和赫夫曼编码"<<endl;HuffmanCoding(HT,HC,w,n);cout<<endl<<"输出赫夫曼树储存数据:"<<endl;for(i=1;i<=2*n-1;i++){cout<<HT[i].weight<<" "<<HT[i].parent<<" "<<HT[i].lchild<<" "<<HT[i].rchild<<endl;}cout<<"输出赫夫曼编码"<<endl;for(i=1;i<=n;i++){cout<<HC[i]<<endl;}}线索二叉树:#include <stdio.h>#include <malloc.h>typedef enum PointerTag {Link,Thread} ; /*指针标志*/typedef char DataType;typedef struct BiThreTree{ /*定义结点元素*/PointerTag LTag,RTag;DataType data;struct BiThreTree *lchild,*rchild;}BiThreTree;BiThreTree *pre; /*全局变量,用于二叉树的线索化*/ BiThreTree *CreateTree() /*按前序输入建立二叉树*/{BiThreTree *T;DataType ch;scanf("%c",&ch);if(ch=='#')T=NULL;else{T=(BiThreTree *)malloc(sizeof(BiThreTree));T->data=ch;T->LTag=Link; /*初始化时指针标志均为Link*/T->RTag=Link;T->lchild=CreateTree();T->rchild=CreateTree();}return T;}void InThread(BiThreTree *T){BiThreTree *p;p=T;if(p){InThread(p->lchild);if(!p->lchild){ p->LTag=Thread;p->lchild=pre;}if(!pre->rchild){ pre->RTag=Thread;pre->rchild=p;}pre=p;InThread(p->rchild);}}BiThreTree *InOrderThrTree(BiThreTree *T) /*中序线索化二叉树*/ {BiThreTree *Thre; /*Thre为头结点的指针*/Thre=(BiThreTree *)malloc(sizeof(BiThreTree));Thre->lchild=T;Thre->rchild=Thre;pre=Thre;InThread(T);pre->RTag=Thread;pre->rchild=Thre;Thre->rchild=pre;return Thre;}void InThrTravel(BiThreTree *Thre) /*中序遍历二叉树*/{BiThreTree *p;p=Thre->lchild;while(p!=Thre) /*指针回指向头结点时结束*/ {while(p->LTag==Link)p=p->lchild;printf("%4c",p->data);while(p->RTag==Thread&&p->rchild!=Thre){p=p->rchild;printf("%4c",p->data);}p=p->rchild;}}void main(){BiThreTree *T,*Thre;printf("PreOrder Create Binary Tree:\n");T=CreateTree();Thre=InOrderThrTree(T);printf("InOrder Traverse Binary Tree:\n");InThrTravel(Thre);}。

相关文档
最新文档