湘潭大学 数据结构 Ch04 Trees

合集下载

湘潭大学C语言整理

湘潭大学C语言整理

1054 平方数Description描述给你一个整数集合A(无重复元素),如果x,y都属于A,且y=x*x,那么<x,y>组成一个数对,请找出这个集合中满足条件的数对的个数。

比如说集合A={2,3,4},则只有4=2*2,则答案为1。

输入每个样例占2行,第一行为一个非负整数n,n<=1000,为集合中元素的个数,如果n为0则输入结束。

第二行为n个整数,为集合的元素,所有的元素为非负整数,且<=100,000,000,两个整数之间有一个空格隔开。

输出每行输出一个样例的结果。

Sample Input32 3 453 36 5 9 6Sample Output12#include <stdio.h>#include <math.h>#include <string.h>int main(){int n, i, i1, i2, x, y, s, str[1001];while (scanf("%d", &n)==1&&n){s=0;for (i=0;i<n;i++){scanf("%d ", &str[i]);}for (i1=0;i1<n;i1++){x=str[i1]*str[i1];for (i2=0;i2<n;i2++){y=str[i2];if (x==y){s++;}}}printf("%d\n", s);}return 0;}1155 整数分类Description按照下面方法对整数x进行分类:如果x是一个个位数,则x属于x类;否则将x的各位上的数码累加,得到一个新的x,依次迭代,可以得到x的所属类。

比如说24,2+4=6,则24的类别数是6;39,3+9=12,1+2=3,则39的类别数是3。

输入每行输入一个非负整数n,n≤10500,n为0时结束。

湘潭大学计算机科学与技术刘任任版离散数学课后习题答案---第二学期--图论与组合数学.

湘潭大学计算机科学与技术刘任任版离散数学课后习题答案---第二学期--图论与组合数学.

习 题 六1.设G 是一个无回路的图, 求证:若G 中任意两个顶点间有惟一的通路, 则G 是树. 证明:由假设知,G 是一个无回路的连通图,故G 是树。

2.证明:非平凡树的最长通路的起点和终点均为悬挂点. 分析:利用最长通路的性质可证。

证明:设P 是树T 中的极长通路。

若P 的起点v 满足1)(>v d ,则P 不是T 中极长的通路。

对终点u 也可同理讨论。

故结论成立。

3.证明:恰有两个悬挂点的树是一条通路.分析:因为树是连通没有回路的,所以树中至少存在一条通路P 。

因此只需证明恰有两个悬挂点的树中的所有的点都在这条通路P 中即可。

证明:设v u ,是树T 中的两个悬挂点,即1)()(==v d u d 。

因T 是树,所以存在),(v u -通路P :0,1≥k v w uw k 。

显然,2)(≥i w d 。

若2)(>i w d ,则由T 恰有两个悬挂点的假设,可知T 中有回路;若T 中还有顶点x 不在P 中,则存在),(x u -通路,显然u 与x 不邻接,且2)(≥x d 。

于是,可推得T 中有回路,矛盾。

故结论成立。

4.设G 是树, ()k G ≥∆, 求证:G 中至少有k 个悬挂点.分析:由于()k G ≥∆,所以G 中至少存在一个顶点v 的度≥k ,于是至少有k 个顶点与邻接,又G 是树,所以G 中没有回路,因此与v 邻接的点往外延伸出去的分支中,每个分支的最后一个顶点必定是一个悬挂点,因此G 中至少有k 个悬挂点。

证明:设)(G V u ∈,且k m u d ≥≥)(。

于是,存在)(,,1G V v v m ∈ ,使m i G E uv i ,,1),( =∈。

若i v 不是悬挂点,则有),(G V v i ∈'使。

如此下去,有)()(G V v l i ∈,满足,,)(j i v v j l i≠≠且1)()(=l i v d , m i ,,1 =。

故G 中至少有k 个悬挂点。

天大《数据结构》学习笔记四

天大《数据结构》学习笔记四

主 题: 《数据结构》学习笔记 内 容:《数据结构》学习笔记四——树一、树形结构1、术语:树、子树、根结点、结点的度、叶结点、树的度、结点的子结点、结点的父结点、结点 的层次、树的深度(高)、森林。

2、二叉树: 2.1二叉树不属于“树”。

2.2 二叉树的性质:①在二叉树的第i 层上至多有2i -1个结点(i ≥1)②深度为K 的二叉树至多有2k-1个结点(k ≥1) ③对任何一棵二叉树,如叶结点的个数为n 0,2度结点个数为n 2则n 0=n 2+1 说明:分支数为B ,二叉树的结点总数为n =n 0+n 1+ n 2 ∵B =n -1(从结点的头上看) B =n 1+2n 2(从结点的下方看) ∴n -1=n 1+2n 2即n 0+n 1+n 2-1=n 1+2n 2 ∴n 0=n 2+13、二叉树的存储结构:s t r u c t n o d e{c h a r d a t a ;s t r u c t n o d e *l c h i l d ; s t r u c t n o d e *r c h i l d ; }4、树转换为二叉树:(右链为兄弟) A BC E A B CDE AB C DE F二、遍历二叉树1、规则:1.1先序:打印,遍历左子树,遍历右子树。

A ,B ,D ,C ,E ,F 1.2中序:遍历左子树,打印,遍历右子树。

D ,B ,A ,E ,C ,F 1.3后序:遍历左子树,遍历右子树,打印。

D ,B ,E ,F ,C ,Aa*b-c 此式可画成一个二叉树,如左:先序: -*abc 中序: a*b-c后序: ab*c-3、程序: 3.1先序: preorder(p)struct node *p {if (p){printf(“%c,”,p->data); preorder (p->lchild); preorder(p->rchild); } }3.2中序: …… { preorder (p->lchild);printf(“%c,”,p->data); preorder(p->rchild); } ……3.3后序: ……RC E F H K R ABCDEFGHK{ preorder (p->lchild);preorder(p->rchild);printf(“%c,”,p->data);}……4、求已知二叉树上的叶结点个数:4.1思路:遍历二叉树,如遇到叶结点,则记数器增值。

湘潭大学数据结构实验3实验报告源代码栈和队列剖析

湘潭大学数据结构实验3实验报告源代码栈和队列剖析

“数据结构和算法II”课程实验报告实验名称:栈和队列的综合应用班级姓名学号实验日期:实验机时:2 学时实验成绩:-------------------------------------------------------------------------------一.实验目的:1.熟悉栈的定义和基本操作2.熟悉队列的定义和基本操作3.掌握递归和非递归算法的实现技术和实际应用4.加深对栈结构的理解,培养解决实际问题的编程能力。

二.实验内容:(1)基本实验内容:实现Hanoi 塔的问题;完成迷宫问题或马踏棋盘问题求解。

三.程序及注释:1.Hanoi塔问题:typedef int ElementType;#ifndef _Stack_h#define _Stack_hstruct Node;typedef struct Node *PtrToNode;typedef PtrToNode Stack;int IsEmpty( Stack S );Stack CreateStack( void );void DisposeStack( Stack S );void MakeEmpty( Stack S );void Push( ElementType X, Stack S );ElementType Top( Stack S );void Pop( Stack S );#endif#include <stdio.h>#include <stdlib.h>#define Error( Str ) FatalError( Str )#define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 ) #include <stdlib.h>struct Node//定义栈的结构{ElementType Element;PtrToNode Next;char bianhao;};int IsEmpty( Stack S )//判断栈是否为空{return S->Next == NULL;}Stack CreateStack()//创建一个空栈{Stack S;S = malloc( sizeof( struct Node ) );if( S == NULL )FatalError( "Out of space!!!" );S->Next = NULL;MakeEmpty( S );return S;}void MakeEmpty( Stack S )//将栈置空{if( S == NULL )Error( "Must use CreateStack first" );elsewhile( !IsEmpty( S ) )Pop( S );}Void DisposeStack( Stack S )//销毁栈{MakeEmpty( S );free( S );}void Push( ElementType X, Stack S )//向栈S中插入元素n{PtrToNode TmpCell;TmpCell = malloc( sizeof( struct Node ) );if( TmpCell == NULL )FatalError( "Out of space!!!" );else{TmpCell->Element = X;TmpCell->Next = S->Next;S->Next = TmpCell;}}Void Pop( Stack S )//推出栈顶元素{PtrToNode FirstCell;if( IsEmpty( S ) )Error( "Empty stack" );else{FirstCell = S->Next;S->Next = S->Next->Next;free( FirstCell );}}void Move(Stack x,int n,Stack z)//将第编号为n的圆盘从x移动到z{Pop(x);Push(n,z);printf("%2d:将原盘 %d 从 %c 移动到 %c\n",++c,n,x->bianhao,z->bianhao);} void hanoi(int n,Stack x,Stack y,Stack z)//汉诺塔问题解决函数{if (n==1)Move(x,1,z);else{hanoi(n-1,x,z,y);//将编号为1到n-1的圆盘从x利用z移动到yMove(x,n,z);//将编号为n的圆盘从x移动到zhanoi(n-1,y,x,z);}}// 将编号为1到n-1的圆盘从y利用x移动到zint main(){int n,i;Stack x=CreateStack();x->bianhao='x';//对栈x进行编号Stack y=CreateStack();y->bianhao='y';//对栈y进行编号Stack z=CreateStack();z->bianhao='z';//对栈z进行编号printf("请输入Hanoi塔的高度\n");scanf("%d",&n);for(i=n;i>0;i--)Push(i,x);hanoi(n,x,y,z);printf("移动完成!!!");DisposeStack(x);//销毁栈xDisposeStack(y);//销毁栈yDisposeStack(z);//销毁栈z}2.马踏棋盘typedef int ElementType;#ifndef _Stack_h#define _Stack_hstruct Node;typedef struct Node *PtrToNode;typedef PtrToNode Stack;int IsEmpty( Stack S );Stack CreateStack( void );void DisposeStack( Stack S );void MakeEmpty( Stack S );void Push( ElementType X, Stack S );ElementType Top( Stack S );void Pop( Stack S );#include <stdio.h>#include <stdlib.h>#define Error( Str ) FatalError( Str )#define FatalError( Str ) fprintf( stderr, "%s\n", Str ), exit( 1 ) #include <stdlib.h>struct Node//定义栈的结构{ElementType Element;PtrToNode Next;};int IsEmpty( Stack S )//判断栈是否为空{return S->Next == NULL;}Stack CreateStack()//创建一个栈{Stack S;S = malloc( sizeof( struct Node ) );if( S == NULL )FatalError( "Out of space!!!" );S->Next = NULL;MakeEmpty( S );return S;}void MakeEmpty( Stack S )//将栈制空{if( S == NULL )Error( "Must use CreateStack first" );elsewhile( !IsEmpty( S ) )Pop( S );}void DisposeStack( Stack S )//销毁栈{MakeEmpty( S );free( S );}void Push( ElementType X, Stack S )//向栈内输入一个值{PtrToNode TmpCell;TmpCell = malloc( sizeof( struct Node ) );if( TmpCell == NULL )FatalError( "Out of space!!!" );else{TmpCell->Element = X;TmpCell->Next = S->Next;S->Next = TmpCell;}}int e;//用来暂时储存从栈里pop出的元素void Pop( Stack S )//输出栈顶的元素{PtrToNode FirstCell;if( IsEmpty( S ) )Error( "Empty stack" );else{e=S->Next->Element;FirstCell = S->Next;S->Next = S->Next->Next;free( FirstCell );}}void solve(int a,int b,Stack x,Stack y)//棋盘问题函数{int qipan[9][9]={0};qipan[a][b]=1;int i,m,n,step[10][3]={{0,0,0},{1,1,2},{2,1,-2},{3,-1,2},{4,-1,-2},{5,2,1},{6,2,-1},{7,-2,1},{8,-2,-1},{9,0,0}}; //定义棋子行走规则Push(a,x);//向栈x输入起始位置x的值Push(b,y);//向栈y输入起始位置y的值int c[65]={0};//用于储存棋子在每个位置时所选择的路径编号for(i=1;i<3;i++){c[i]++;if(c[i]==9)//如果当前位置的棋子8个路径均不可用,则将当前位置编号置0,从栈x、y中pop出上一步棋子的位置,并设置为当前位置{c[i]=0;i=i-2;qipan[a][b]=0;Pop(x);a=e;Pop(y);b=e;continue;}m=a+step[c[i]][1];n=b+step[c[i]][2];while((!(m>0&&m<9&&n>0&&n<9))||(qipan[m][n]!=0))//当所选路径不合法时,选择下一条路径{c[i]++;//路径编号递增m=a+step[c[i]][1];n=b+step[c[i]][2];if(c[i]==9)//如果当前位置的棋子8个路径均不可用,则将当前位置编号置0,从栈x、y中pop出上一步棋子的位置,并设置为当前位置{qipan[a][b]=0;Pop(x);a=e;Pop(y);b=e;break;}}if(c[i]==9)//若当前棋子无路可走,将路径编号置0后,将位置编号回溯{c[i]=0;i=i-2;continue;}qipan[m][n]=i+1;//若路径可用,将移动后的位置输入栈内,并将当前位置设置为移动后的位置Push(m,x);Push(n,y);a=m;b=n;}int p,q;for(p=1;p<9;p++)//输出解决方案{for(q=1;q<9;q++)printf("%3d",qipan[p][q]);printf("\n");}}int main()//主函数{int a,b;Stack x=CreateStack();Stack y=CreateStack();printf("请输入马的初始位置(x,y),以空格隔开,其中x、y均为1~8区间内的整数\n");scanf("%d%d",&a,&b);solve(a,b,x,y);DisposeStack(x);DisposeStack(y);}四.运行结果:1.hanoi塔问题:2.马踏棋盘:五.实验心得:在本课程设计中,我明白了理论与实际应用相结合的重要性,并提高了自己组织数据及编写大型程序的能力。

湘潭大学计算机科学与技术刘任任版离散数学课后习题答案-第二学期--图论与组合数学

湘潭大学计算机科学与技术刘任任版离散数学课后习题答案-第二学期--图论与组合数学

湘潭大学计算机科学与技术刘任任版离散数学课后习题答案-第二学期--图论与组合数学习题六1.设G是一个无回路的图,求证:若G中任意两个顶点间有惟一的通路,则G是树.证明:由假设知,G是一个无回路的连通图,故G是树。

2.证明:非平凡树的最长通路的起点和终点均为悬挂点.分析:利用最长通路的性质可证。

证明:设P是树T中的极长通路。

若P的起点v满足d(v)1,则P不是T中极长的通路。

对终点u也可同理讨论。

故结论成立。

3.证明:恰有两个悬挂点的树是一条通路.分析:因为树是连通没有回路的,所以树中至少存在一条通路P。

因此只需证明恰有两个悬挂点的树中的所有的点都在这条通路P中即可。

证明:设u,v是树T中的两个悬挂点,即d(u)d(v)1。

因T是树,所以存在(u,v)-通路P:uw1wkv,k0。

显然,d(wi)2。

若d(wi)2,则由T恰有两个悬挂点的假设,可知T中有回路;若T中还有顶点某不在P中,则存在(u,某)-通路,显然u与某不邻接,且d(某)2。

于是,可推得T中有回路,矛盾。

故结论成立。

4.设G是树,Gk,求证:G中至少有k个悬挂点.分析:由于Gk,所以G中至少存在一个顶点v的度≥k,于是至少有k个顶点与邻接,又G是树,所以G中没有回路,因此与v邻接的点往外延伸出去的分支中,每个分支的最后一个顶点必定是一个悬挂点,因此G中至少有k个悬挂点。

证明:设uV(G),且d(u)mk。

于是,存在v1,,vmV(G),使(l)uviE(G),i1,,m。

若vi不是悬挂点,则有viV(G),使。

如此下去,有viV(G),满足vi(l)vj,ij,且d(vi(l))1,i1,,m。

故G中至少有k个悬挂点。

5.设Gp,q是一个图,求证:若qp,则G中必含回路.分析:利用树是没有回路且连通的图,且树中的顶点数和边数的关系可证。

证明:设G(p,q)有k个分支:G[V1]G1(p1,q1),,G[Vk]Gk(pk,qk)。

显然,pp1pk,qq1qk。

数据结构Ch习题答案

数据结构Ch习题答案

Ch9查找一、单项选择题1.顺序查找法适合于存储结构为B的线性表..A.散列存储 B.顺序存储或链接存储 C.压缩存储 D.索引存储2.对线性表进行二分查找时;要求线性表必须C..A.以顺序方式存储 B.以链接方式存储C.以顺序方式存储;且结点按关键字有序排序 D.以链接方式存储;且结点按关键字有序排序3.采用顺序查找方法查找长度为n的线性表时;每个元素的平均查找长度为C.. A.n B.n/2 C.n+1/2 D.n-1/24.采用二分查找方法查找长度为n的线性表时;每个元素的平均查找长度为D..A.On2 B. Onlog2n C.On D.Olog2n5.二分查找和二叉排序树的时间性能B..A.相同 B.不相同就平均时间性能而言;二叉排序树上的查找和二分查找差不多..就维护表的有序性而言;二叉排序树无须移动结点;只需修改指针即可完成插入和删除操作;且其平均的执行时间均为Olog2n;因此更有效..二分查找所涉及的有序表是一个向量;若有插入和删除结点的操作;则维护表的有序性所花的代价是On..当有序表是静态查找表时;宜用向量作为其存储结构;而采用二分查找实现其查找操作;若有序表里动态查找表;则应选择二叉排序树作为其存储结构..6.有一个有序表为{1;3;9;12;32;41;45;62;75;77;82;95;100};当二分查找值82为的结点时;C次比较后查找成功..A.1 B.2 C.4 D.87.有一个长度为12的有序表;按二分查找法对该表进行查找;在表内各元素等概率情况下查找成功所需的平均比较次数为B..A.35/12 B.37/12 C.39/12 D.43/128.根据一组记录 56; 42; 50; 64; 48 依次插入结点生成一棵AVL树高度平衡的二叉搜索树时;当插入到值为 50 的结点时需要进行旋转调整..9.向一棵二叉搜索树中插入一个新元素时;若该新元素的值大于根结点的值;则应把它插入到根结点右子树上..10.根据一组记录 56; 42; 73; 50; 64; 48; 22 依次插入结点生成一棵AVL树高度平衡的二叉搜索树时;当插入到值为 48 的结点时才出现不平衡;需要进行旋转调整..11.以顺序搜索方法从长度为n的顺序表或单链表中搜索一个元素时;其时间复杂度为On ..12.在一棵AVL树高度平衡的二叉搜索树中;每个结点的左子树高度与右子树高度之差的绝对值不超过 1 ..13.在线性表的散列存储中;装载因子 a 又称为装载系数;若用m表示散列表的长度;n 表示待散列存储的元素的个数;则 a 等于 n/m ..n.. 14.以折半搜索方法从长度为n的有序表中搜索一个元素时;时间复杂度为 Olog2 15.假定一个顺序表的长度为40;并假定搜索每个元素的概率都相同;则在搜索成功情况下的平均搜索长度为 20.5 ..16.假定要对长度n = 100的线性表进行散列存储;并采用开散列法处理冲突;则对于长度m = 20的散列表;每个散列地址的同义词子表单链表的长度平均为 5 ..17.假定对长度n = 50的有序表进行折半搜索;则对应的判定树中最后一层的结点数为 19 个..1 2 4 8 16 1918.根据n个元素建立一棵二叉搜索树二叉排序树的时间复杂度性大致为 Onlogn ..2 19.从一棵二叉搜索树中搜索一个元素时;若给定值小于根结点的值;则需要向左子树继续搜索..20.假定一个线性表为”abcd”; ”baabd”; ”bcef”; ”cfg”; ”ahij”; ”bkwte”; ”ccdt”; ”aayb”;若按照字符串的第一个字母进行划分;使得第一个字母相同的字符串被划分在一个子表中;则得到的以a为第一个字母的子表长度 3 ..21.假设在有序线性表A1..20上进行二分查找;则比较一次查找成功的结点数为1;则比较二次查找成功的结点数为2;则比较三次查找成功的结点数为4;则比较四次查找成功的结点数为8;则比较五次查找成功的结点数为5;平均查找长度为3.7.. 22.对于长度为n的线性表;若进行顺序查找;则时间复杂度为On;若采用二分法查找;则时间复杂度为Ologn ..223、对长度为3的顺序表进行搜索;若搜索第一个元素的概率为1/2;搜索第二个元素的概率为1/3;搜索第三个元素的概率为1/6;则搜索到表中任一元素的平均搜索长度为 A ..A.5/3 B.2 C.7/3 D.4/31/23+1/32+1/61=9/6+4/6+1/6=7/31/21+1/32+1/63=3/6+4/6+3/6=5/324、向一棵AVL树高度平衡的二叉搜索树插入元素时;可能引起对最小不平衡子树的双向旋转的调整过程;此时需要修改相关 C 个结点指针域的值..A.2 B.3 C.4 D.525、向一棵AVL树高度平衡的二叉搜索树插入元素时;可能引起对最小不平衡子树的调整过程;此调整分为 C种旋转类型..A.2 B.3 C.4 D.526、向一棵AVL树高度平衡的二叉搜索树插入元素时;可能引起对最小不平衡子树的左单或右单旋转的调整过程;此时需要修改相关 C个结点指针域的值..A.2 B.3 C.4 D.5三、判断题:1.×对二叉搜索树进行前序遍历得到的结点序列是一个有序序列..2.√折半搜索所对应的判定树;既是一棵二叉搜索树;又是一棵理想平衡二叉树它的特点是除最底层结点外其他各层结点数都是满的;最底层的若干结点可能散布在该层各处..3.√装载因子是散列表的一个重要参数;它反映了散列表的装满程度..4.√对于两棵具有相同记录集合而具有不同结构的二叉搜索树;按中序遍历得到的结点序列是相同的..三、综合练习题:1.画出对长度为10的有序表进行折半查找的判定树;并求其等概率时查找成功的平均查找长度..等概率时查找成功的平均查找长度=11+22+43+34/10=2.92.已知一组关键字{49;38;65;97;76;13;27;44;82;35;50};画出由此生成的二叉排序树和平衡二叉树..二叉排序树:平衡二叉树:3.设某字典组成如下∶D={016; 087; 154; 170; 275; 426; 503; 509; 512; 612; 653; 677; 703; 765; 897; 908}依次顺序表示在内存中;现用二分法的方法查找字典中是否有元素612;问需要进行多少次比较才能得到结论每次选择的比较对象是什么元素解:比较次数为3次;第一次和509比较;第二次和677比较;第三次和612比较.. 4.试给出一个关键码序列;使构造AVL树时四种调整平衡操作 LL; LR; RR; RL 各至少执行一次;并画出其构造过程..:解:设输入序列为{12;6;4;16;24;15;13;1;3}5.设顺序表中关键字是递增有序的;试写一顺序查找算法;将哨兵设在表的高下标端..解:Search_SeqSSTable ST; KeyType key{//顺序查找的算法;n号元素为监视哨ST.elemn.key=key; //哨兵for i=0; EQST.elemi.key;key;++i;return i;}6.什么叫静态查找什么叫动态查找什么样的存储结构适宜于进行静态查找什么样的存储结构适宜于进行动态查找7.什么叫平均查找长度写出平均查找长度的定义..8.已知一个个数为12的数据元素序列为{Dec; Feb; Nov; Oct; June; Sept; Aug; Apr; May; July; Jan; Mar};要求:1按各数据元素的顺序构造一棵二叉排序树..2设各数据元素的查找概率相等;给出该二叉排序树的平均查找长度..注:字母的大小是指字母的ASCII码数值大小3按各数据元素的顺序构造一棵平衡二叉树..解:1构造的二叉排序树:2平均查找长度为:11+22+23+24+35+26/12=46/12=23/63构造的平衡二叉树:9.使用散列函数hash x = x %11; 把一个整数值转换成散列表地址..现要把数据1; 13; 12; 34; 38; 33; 27; 22 插入到散列表中..1 使用线性探查再散列法来构造散列表..2 使用链地址法构造散列表..针对这两种情况; 确定其装载因子; 搜索成功所需的平均探查次数; 以及搜索不成功所需的平均探查次数..解:1Hash1=1;成功hash13=2;成功hash12=1;冲突;hash12=2;冲突;hash12=3;成功;hash34=1;hash34=2;冲突;hash34=3;冲突;hash34=3;冲突;hash34=4;成功hash38=5;成功hash33=0;成功hash27=5;冲突; hash27=6;成功hash22=0;冲突;hash22=1;冲突;hash22=2;冲突;hash22=3;冲突;hash22=4;冲突;hash22=5;冲突;hash22=6;冲突;hash22=7;成功线性探查再散列法来构造的散列表装载因子=8/11搜索成功所需的平均探查次数=1+1+1+3+4+1+2+8/8=21/8搜索不成功所需的平均探查次数=9+8+7+6+5+4+3+2+1+1+1/11=47/11 2 使用链地址法构造的散列表装载因子=8/11搜索成功所需的平均探查次数=1+1+1+1+2+2+2+3/8=13/8搜索不成功所需的平均探查次数=3+4+2+1+1+3+1+1+1+1+1/11=19/11。

湘潭大学 数据结构 课件 ppt Ch02 Algorithm Analysis

湘潭大学 数据结构 课件 ppt Ch02 Algorithm Analysis
例如, 假设Tp1 ( N ) = 106N , Tp2 ( N ) = N2. 即使看起来( N2 ) 比( N )增长得更快,但当N < 106, P2仍然比P1快.
复杂度的渐进表示法
常用函数增长表
输入规模n 8 1 3 8 24 64 512
函数 1 log2 n n n log2 n n2 n3
Note: 1. 将常数或低阶项放进大O是非常不好的习惯——低阶项一
般被忽略,常数也可以丢弃掉(要求的精度是很低的);
2. 能够通过计算极限limf(N)/g(N)来确定两个函数的相对增长 率; 3. 不要说成f(N)<=O(g(N)),因为定义已经隐含有不等式了。
Note: 当我们比较两个程序的复杂度时,确保N足够大。
结论对 N 2k 程序在教材 同样正确 p.40
应用实例:最大子列和问题
算法 4
“在线”算法
int MaxSubsequenceSum( const int A[ ], int N ) { 该算法的核心思想是基于下面的事实: int ThisSum, MaxSum, j; /* 1*/ ThisSum = MaxSum = 0; 1 3 3 2 2 4 4 6 1 6 1 /* 2*/ for ( j = 0; j < N; j++ ) { 如果整数序列 {a1, a2 , …, /* 3*/ ThisSum += A[ j ]; an}的最大和子列是 {ai, ai+1, …, aj} , l 那么必定有 对任意 /* 4*/ if ( ThisSum >0 MaxSum ) i ≤ l ≤ j 都成立。 a . k i k /* 5*/ MaxSum = ThisSum; /* 6*/ else if ( ThisSum < 0 ) 因此,一旦发现当前子列和为负,则可以重新开始考察一个新 /* 7*/ ThisSum = 0; 的子列。 } /* end for-j */ -2 4 1 -6 3 -1 5 /* 8*/ return MaxSum; }

数据结构(第4版)习题及实验参考答案 数据结构复习资料完整版(c语言版)

数据结构(第4版)习题及实验参考答案 数据结构复习资料完整版(c语言版)

数据结构基础及深入及考试复习资料习题及实验参考答案见附录结论1、数据的逻辑结构是指数据元素之间的逻辑关系。

即从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

2、数据的物理结构亦称存储结构,是数据的逻辑结构在计算机存储器内的表示(或映像)。

它依赖于计算机。

存储结构可分为4大类:顺序、链式、索引、散列3、抽象数据类型:由用户定义,用以表示应用问题的数据模型。

它由基本的数据类型构成,并包括一组相关的服务(或称操作)。

它与数据类型实质上是一个概念,但其特征是使用与实现分离,实行封装和信息隐蔽(独立于计算机)。

4、算法:是对特定问题求解步骤的一种描述,它是指令的有限序列,是一系列输入转换为输出的计算步骤。

5、在数据结构中,从逻辑上可以把数据结构分成( C )A、动态结构和表态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、内部结构和外部结构6、算法的时间复杂度取决于( A )A、问题的规模B、待处理数据的初态C、问题的规模和待处理数据的初态线性表1、线性表的存储结构包括顺序存储结构和链式存储结构两种。

2、表长为n的顺序存储的线性表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为( E ),删除一个元素需要移动的元素的个数为( A )。

A、(n-1)/2B、nC、n+1D、n-1E、n/2F、(n+1)/2G、(n-2)/23、“线性表的逻辑顺序与存储顺序总是一致的。

”这个结论是( B )A、正确的B、错误的C、不一定,与具体的结构有关4、线性表采用链式存储结构时,要求内存中可用存储单元的地址( D )A、必须是连续的B、部分地址必须是连续的C一定是不连续的D连续或不连续都可以5、带头结点的单链表为空的判定条件是( B )A、head==NULLB、head->next==NULLC、head->next=headD、head!=NULL6、不带头结点的单链表head为空的判定条件是( A )A、head==NULLB、head->next==NULLC、head->next=headD、head!=NULL7、非空的循环单链表head的尾结点P满足( C )A、p->next==NULLB、p==NULLC、p->next==headD、p==head8、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是(B )A、O(1)B、O(n)C、O(n2)D、O(nlog2n)9、在一个单链表中,若删除p所指结点的后继结点,则执行( A )A、p->next=p->next->next;B、p=p->next;p->next=p->next->next;C、p->next=p->next;D、p= p->next->next;10、在一个单链表中,若在p所指结点之后插入s所指结点,则执行( B )A、s->next=p;p->next=s;B、s->next=p->next;p->next=s;C、s->next=p->next;p=s;D、p->next=s;s->next=p;11、在一个单链表中,已知q是p的前趋结点,若在q和p之间插入结点s,则执行(C )A、s->next=p->next;p->next=s;B、p->next=s->next;s->next=p;C、q->next=s;s->next=p;D、p->next=s;s->next=q;12、在线性结构中,第一个结点没有前趋结点,其余每个结点有且只有 1 个前趋结点。

湘潭大学833数据结构真题

湘潭大学833数据结构真题

湘潭大学833数据结构真题一、选择题(共 15小题,每小题 2 分,共30分)1.某算法的时间复杂度为O(n^2),表明该算法的()。

[单选题] *A.问题规模是n^2B.执行时间等于n^2C.执行时间与n^2成正比(正确答案)D.问题规模与n^2成正比2.在一个单链表中,删除p结点(非尾结点)之后的一个结点的操作是()。

[单选题] *A.p->next=pB.p->next->next=p->nextC.p->next->next=pD.p->next=p->next->next(正确答案)3.设计算法要求算法能够提供异常处理,对不合理的数据进行检查,这属于算法设计的()目标。

[单选题] *A.正确性B.可读性C.可使用性D.健壮性(正确答案)4.在下列排序方法中,关键字比较的次数与记录的初始排列次序无关的是()。

[单选题] *A.希尔排序B.冒泡排序C.直接插入排序D.简单选择排序(正确答案)5.在一棵3叉树中度为3的结点数为两个,度为2的结点数为一个,度为1的结点数为两个,则度为0的结点数为()个。

[单选题] *A.4B.5C.6(正确答案)D.76.若无向图G(V,E)中含有17个顶点,则保证图G在任何情况下,都是连通的需要的边数最少是()。

[单选题] *A.6B.15C.16(正确答案)D.217.在以下排序方法中,()是稳定的排序方法。

[单选题] *A.简单选择排序B.折半插入排序(正确答案)C.希尔排序D.快速排序8.一棵完全二叉树有1001个结点,其叶子结点的个数是()。

[单选题] *A.250B.501(正确答案)C.254D.5059.经过以下栈运算后StackEmpty(s)的值为()。

InitStack(s);Push(s,a);Push(s,b);Pop(s,x);Pop(s,y) [单选题] *A.aB.bC.1(正确答案)D.010.已知一棵3阶B-树中有2047个关键字,则树的最大高度是()。

湘潭大学 数据结构实验8 实验报告 源代码 赫夫曼编码

湘潭大学 数据结构实验8 实验报告 源代码 赫夫曼编码

“数据结构和算法II”课程实验报告实验名称:赫夫曼编码及其应用班级姓名学号实验日期:实验机时:2 学时实验成绩:-------------------------------------------------------------------------------一.实验目的:掌握赫夫曼树的概念、存储结构掌握建立赫夫曼树和赫夫曼编码的方法及带权路径长度的计算熟练掌握二叉树的应用二.实验内容:(1)基本实验内容:实现赫夫曼树的生成,完成赫夫曼编码的输出;(2)扩展实验内容:完成一组码字的赫夫曼编码及解码(以一个文本文件的内容为例).三.程序及注释:#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAXLEN 100typedef struct{ int weight;int lchild;int rchild;int parent;char key;}htnode;typedef htnode hfmt[MAXLEN];int n;void inithfmt(hfmt t)//对结构体进行初始化{ int i;printf("\n");printf("------------------------------------------------------------------\n");printf("******************************输入区*****************************\n");printf("\n请输入n=");scanf("%d",&n);getchar();for(i=0;i<2*n-1;i++)//对结构体进行初始化{ t[i].weight=0;t[i].lchild=-1;t[i].rchild=-1;t[i].parent=-1; }printf("\n"); }void inputweight(hfmt t)//输入函数{ int w;//w为权值int i;char k;//k表示获取的字符for(i=0;i<n;i++){ printf("请输入第%d个字符:",i+1);scanf("%c",&k);getchar();t[i].key=k;printf("请输入第%d个字符的权值:",i+1);scanf("%d",&w);getchar();t[i].weight=w;printf("\n");} }void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数{ long min1=999999;long min2=999999;int j;for(j=0;j<=i;j++)//选择最小权值字符的下标返回if(t[j].parent==-1)if(min1>t[j].weight){ min1=t[j].weight;*p1=j; }for(j=0;j<=i;j++)//选择次小权值字符的下标返回if(t[j].parent==-1)if(min2>t[j].weight && j!=(*p1))//注意j!=(*p1)) { min2=t[j].weight;*p2=j; } }void creathfmt(hfmt t)//创建哈夫曼树的函数{ int i,p1,p2;inithfmt(t);inputweight(t);for(i=n;i<2*n-1;i++){ selectmin(t,i-1,&p1,&p2);t[p1].parent=i;t[p2].parent=i;t[i].lchild=p1;t[i].rchild=p2;t[i].weight=t[p1].weight+t[p2].weight; } }void printhfmt(hfmt t)//打印哈夫曼树{ int i;printf("------------------------------------------------------------------\n");printf("**********************哈夫曼编数结构*****************************\n");printf("\t\t权重\t父母\t左孩子\t右孩子\t字符\t");for(i=0;i<2*n-1;i++){ printf("\n");printf("\t\t%d\t%d\t%d\t%d\t%c",t[i].weight,t[i].parent,t[i].lchild,t[i].rchild,t[i].key); }printf("\n------------------------------------------------------------------\n"); printf("\n\n"); }void hfmtpath(hfmt t,int i,int j)//编码的重要哈夫曼树路径递归算法{ int a,b;a=i;b=j=t[i].parent;if(t[j].parent!=-1){ i=j;hfmtpath(t,i,j); }if(t[b].lchild==a)printf("0");elseprintf("1");void phfmnode(hfmt t)//对字符进行初始编码{ int i,j,a;printf("\n------------------------------------------------------------------\n");printf("**************************哈夫曼编码*****************************");for(i=0;i<n;i++){ j=0;printf("\n");printf("\t\t%c\t",t[i].key,t[i].weight);hfmtpath(t,i,j); }printf("\n------------------------------------------------------------------\n"); }void encoding(hfmt t)//对用户输入的电文进行编码{ char r[1000];//用来存储输入的字符串int i,j;printf("\n\n请输入需要编码的字符:");gets(r);printf("编码结果为:");for(j=0;r[j]!='\0';j++)for(i=0;i<n;i++)if(r[j]==t[i].key)hfmtpath(t,i,j);printf("\n"); }void decoding(hfmt t)//对用户的密文进行译码{ char r[100];int i,j,len;j=2*n-2;//j初始从树的根节点开始printf("\n\n请输入需要译码的字符串:");gets(r);len=strlen(r);printf("译码的结果是:");for(i=0;i<len;i++){ if(r[i]=='0'){ j=t[j].lchild;if(t[j].lchild==-1){ printf("%c",t[j].key);j=2*n-2; } }else if(r[i]=='1'){ j=t[j].rchild;if(t[j].rchild==-1){ printf("%c",t[j].key);j=2*n-2; } } }printf("\n\n"); }int main(){ int i,j;hfmt ht;char flag;creathfmt(ht);printhfmt(ht);phfmnode(ht);printf("\n------------------------------------------------------------------\n");printf("***************************编码&&译码&&退出**********************");printf("\n[1]编码\t[2]译码\t[0]退出");printf("\n您的选择是:");flag=getchar();getchar();while(flag!='0'){ if(flag=='1')encoding(ht);else if(flag=='2')decoding(ht);elseprintf("您的输入有误,请重新输入\n");printf("\n***************************编码&&译码&&退出**********************"); printf("\n[1]编码\t[2]译码\t[0]退出");printf("\n您的选择是:");flag=getchar();getchar(); }printf("\n\n-----------------------------------------------------------------\n"); printf("***************欢迎使用哈夫曼编码系统*******************\n");printf("-----------------------------------------------------------------\n");system("pause"); }四.运行结果:五.实验心得:通过本次课程设计,我对二叉树和赫夫曼树有了更好的认识,在实验过程中,我掌握了赫夫曼树的构造方法,学会了如何将理论知识转换成实际应用。

2014年数据结构考研大纲——湘潭大学

2014年数据结构考研大纲——湘潭大学

2014年数据结构考研大纲——湘潭大学湘潭大学2014数据结构考研大纲(一)考试对象参加全日制专业学位研究生《计算机技术》和《软件工程》专业复试考生。

(二)考试目的考核学生对本课程知识的掌握和运用能力,属水平测试。

(三)考试的内容、要求第一章绪论考试内容数据结构的基本概念和术语; 算法的描述; 算法设计的要求; 算法效率的度量; 算法的存储空间需求。

考试要求1.有关数据的基本概念;2.领会抽象数据类型与数据结构的关系及抽象数据类型在算法设计中的意义和作用;3.掌握数据的逻辑结构及有关术语的定义,掌握数据结构的表示方法,能用序偶集合表示关系;4.了解数据的逻辑结构和存储结构的分类;5.掌握描述算法的语言;6.算法的存储空间需求;7.领会算法设计的要求算法效率度量的意义和作用,懂得算法分析原理,掌握算法分析技术;第二章线性表考试内容线性表的逻辑结构; 线性表的顺序存储结构; 线性表的链式存储结构; 一元多项式的表示及相加和相乘算法。

考试要求1.熟练掌握顺序存储的线性表的基本操作的实现,熟练掌握链式存储的线性表的动态存储和静态存储的方法及其算法;2.循环链表的应用,一元多项式的表示及相加和相乘算法;3.掌握顺序存储的线性表和链式存储的线性表的主要优缺点;4.掌握对顺序存储的线性表和链式存储的线性表的各种算法的评价;第三章栈与队列考试内容栈;表达式求值; 栈与递归过程; 队列。

考试要求1.顺序栈与链栈的结构及操作,要求达到综合应用层次;2.顺序栈与链栈的比较;3.顺序队与链队的结构及操作,要求达到综合应用层次;4.顺序队与链队的比较;5.弄清队与栈及线性表的异同。

掌握循环队的组织方法及有关算法;6.递归过程的模拟。

第四章串考试内容串及其操作; 串的存储结构; 串基本操作的实现。

考试要求1.领会串的逻辑结构定义,掌握串的基本操作;2.掌握串的存储结构及其算法实现;3.掌握模式匹配的原理及其KMP算法。

第五章数组和广义表考试内容数组的定义和数组分量的地址计算; 数组的顺序存储结构; 矩阵的压缩存储; 广义表的定义; 广义表的存储结构; 广义表的递归算法。

湘潭大学算法设计与分析知识点

湘潭大学算法设计与分析知识点

第一章算法概述1、算法的五个性质:有穷性、确定性、能行性、输入、输出。

2、算法的复杂性取决于:(1)求解问题的规模(N),(2)具体的输入数据(I),(3)算法本身的设计(A),C=F(N,I,A)。

3、算法的时间复杂度的上界记号O,下界记号Ω(记为f(N) = Ω(g(N))。

即算法的实际运行时间至少需要g(n)的某个常数倍时间),同阶记号Θ:f(N)= Θ(g(N))表示f(N)和g(N)同阶。

即算法的实际运行时间大约为g(n)的某个常数倍时间。

低阶记号o:f(N)=o(g(N))表示f(N)比g(N)低阶。

多项式算法时间:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)约定logn表示以2为底的对数。

指数时间算法时间:O(2n)<O(n!)<O(nn)4、常用算法的设计技术:分治法、动态规划法、贪心法、回溯法和分支界限法。

5、常用的几种数据结构:线性表、树、图。

6、算法:是指解决某一问题的运算序列第二章递归与分治1、递归算法的思想:将对较大规模的对象的操作归结为对较小规模的对象实施同样的操作。

递归的时间复杂性可归结为递归方程:其中,a是子问题的个数,b是递减的步长,~表示递减方式,D(n)是合成子问题的开销。

递归元的递减方式~有两种:1、减法,即n – b,的形式。

2、除法,即n / b,的形式。

2、(这里都是针对递减方式为除法的哦)D(n)为常数c:这时,T(n) = O(n p)。

D(n)为线形函数cn:D(n)为幂函数n x:考虑下列递归方程:T(1) = 1⑴T(n) = 4T(n/2) +n⑵T(n) = 4T(n/2) +n2⑶T(n) = 4T(n/2) +n3解:方程中均为a = 4,b = 2,其齐次解为n2。

对⑴,∵a > b1 (D(n) = n) ∴T(n) = O(n2);对⑵,∵a = b2 (D(n) = n2)∴T(n) = O(n2log n);对⑶,∵a < b3 (D(n) = n3)∴T(n) = O(n3);证明一个算法的正确性需要证明两点:1、算法的部分正确性。

湘潭大学 刘任任版 离散数学课后习题答案 习题6

湘潭大学 刘任任版 离散数学课后习题答案 习题6

习 题 六1.设G 是一个无回路的图, 求证:若G 中任意两个顶点间有惟一的通路, 则G 是树. 证明:由假设知,G 是一个无回路的连通图,故G 是树。

2.证明:非平凡树的最长通路的起点和终点均为悬挂点. 分析:利用最长通路的性质可证。

证明:设P 是树T 中的极长通路。

若P 的起点v 满足1)(>v d ,则P 不是T 中极长的通路。

对终点u 也可同理讨论。

故结论成立。

3.证明:恰有两个悬挂点的树是一条通路.分析:因为树是连通没有回路的,所以树中至少存在一条通路P 。

因此只需证明恰有两个悬挂点的树中的所有的点都在这条通路P 中即可。

证明:设v u ,是树T 中的两个悬挂点,即1)()(==v d u d 。

因T 是树,所以存在),(v u -通路P :0,1≥k v w uw k 。

显然,2)(≥i w d 。

若2)(>i w d ,则由T 恰有两个悬挂点的假设,可知T 中有回路;若T 中还有顶点x 不在P 中,则存在),(x u -通路,显然u 与x 不邻接,且2)(≥x d 。

于是,可推得T 中有回路,矛盾。

故结论成立。

4.设G 是树, ()k G ≥∆, 求证:G 中至少有k 个悬挂点.分析:由于()k G ≥∆,所以G 中至少存在一个顶点v 的度≥k ,于是至少有k 个顶点与邻接,又G 是树,所以G 中没有回路,因此与v 邻接的点往外延伸出去的分支中,每个分支的最后一个顶点必定是一个悬挂点,因此G 中至少有k 个悬挂点。

证明:设)(G V u ∈,且k m u d ≥≥)(。

于是,存在)(,,1G V v v m ∈ ,使m i G E uv i ,,1),( =∈。

若i v 不是悬挂点,则有),(G V v i ∈'使。

如此下去,有)()(G V v l i ∈,满足,,)(j i v v j l i≠≠且1)()(=l i v d , m i ,,1 =。

故G 中至少有k 个悬挂点。

2022年湘潭大学兴湘学院计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年湘潭大学兴湘学院计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)

2022年湘潭大学兴湘学院计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、已知广义表LS=((a,b,c),(d,e,f)),用head和tail数取出LS中原子e 的运算是()。

A.head(tail(LS))B.tail(head(LS))C.head(tail(head(tail(LS))))D.head(tail(tail(head(LS))))2、将线性表的数据元素进行扩充,允许带结构的线性表是()。

A.串B.树C.广义表D.栈3、以下与数据的存储结构无关的术语是()。

A.循环队列B.链表C.哈希表D.栈4、下列关于AOE网的叙述中,不正确的是()。

A.关键活动不按期完成就会影响整个工程的完成时间B.任何一个关键活动提前完成,那么整个工程将会提前完成C.所有的关键活动提前完成,那么整个工程将会提前完成D.某些关键活动若提前完成,那么整个工程将会提前完成5、有六个元素6,5,4,3,2,1顺序入栈,下列不是合法的出栈序列的是()。

A.543612B.453126C.346521D.2341566、已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”,采用KMP算法进行匹配,第一次出现“失配”(s!=t)时,i=j=5,则下次开始匹配时,i和j的值分别()。

A.i=1,j=0 B.i=5,j=0 C.i=5,j=2 D.i=6,j=27、下列叙述中,不符合m阶B树定义要求的是()。

A.根结点最多有m棵子树 B.所有叶结点都在同一层上C.各结点内关键字均升序或降序排列 D.叶结点之间通过指针链接8、设X是树T中的一个非根结点,B是T所对应的二叉树。

在B中,X是其双亲的右孩子,下列结论正确的是()。

A.在树T中,X是其双亲的第一个孩子B.在树T中,X一定无右兄弟C.在树T中,X一定是叶结点D.在树T中,X一定有左兄弟9、下述二叉树中,哪一种满足性质:从任一结点出发到根的路径上所经过的结点序列按其关键字有序()。

数据结构lab04

数据结构lab04

数据结构lab04在计算机科学的领域中,数据结构是一门至关重要的学科。

它不仅是我们理解和解决各种计算问题的基础,也是提高程序效率和优化算法的关键。

本次的 lab04 实验,更是让我们深入探索了数据结构的奥秘和实际应用。

数据结构,简单来说,就是数据的组织方式。

就好像我们整理自己的房间,不同的整理方式会影响我们找到和使用物品的效率。

在程序中,合理的数据结构能让我们更快地存储、检索和处理数据。

这次的lab04 实验主要围绕着几种常见的数据结构展开,包括链表、栈和队列。

链表是一种灵活的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

这就像是一串珠子,通过线串起来,每个珠子都知道下一个珠子在哪里。

链表的优点在于可以方便地进行插入和删除操作,不需要像数组那样移动大量的数据。

但缺点是访问特定位置的元素比较慢,需要从头开始逐个遍历。

栈则是一种具有特殊操作规则的数据结构,遵循“后进先出”的原则。

想象一下往一个桶里放东西,最后放进去的东西会最先被拿出来。

在程序中,栈常用于函数调用、表达式求值等场景。

队列则与栈相反,遵循“先进先出”的原则。

就好像排队买东西,先排队的人先得到服务。

队列常用于任务调度、消息传递等方面。

在实验中,我们通过实际的编程操作,深刻体会到了这些数据结构的特点和应用场景。

比如说,在实现一个简单的计算器程序时,我们使用栈来存储操作数和运算符。

当用户输入一个表达式时,程序将数字压入栈中,遇到运算符时则取出栈顶的两个数字进行计算,将结果再压入栈中。

通过这种方式,能够按照正确的运算顺序计算出表达式的结果。

再比如,在模拟银行排队系统时,我们使用队列来管理客户的等待顺序。

新到达的客户排在队尾,服务窗口空闲时从队首取出客户进行服务。

这样能够保证服务的公平性和有序性。

为了更好地理解和掌握这些数据结构,我们不仅要能够正确地实现它们的基本操作,如链表的插入、删除,栈的入栈、出栈,队列的入队、出队,还要能够在实际问题中灵活运用。

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

bill 1
book 1
course 1 hw.c 6 hw.c 8 work 1 course 1
ch1.c 3 ch2.c 2 ch3.c 4 cop3530 1
cop3212 1
fall96 1 spr97 1 sum97 1
fall96 1
preorder ( C ); } }
〖例1〗 列出分级文件系统中的目录。
/usr
mark
alex
bill
book
course hw.c hw.c work course
ch1.c ch2.c ch3.c cop3530
cop3212
fall96 spr97 sum97
fall96
fall97
syl.r syl.r syl.r grades p1.r p2.r p2.r p1.r grades
树的高度(深度)::= height(root) = depth(deepest leaf).
祖先结点(Ancestor) ::=沿树根到某一结点路径上的所有结点都是 这个结点的祖先结点。
子孙结点(Descendant) ::=某一结点的子树中的所有结点是这个 结点的子孙。
2. 树的实现 ❖ 链表表示法
NN NN
N
NN
KL
M
N
NN
NN
Note: 这种表示法并非唯一的,因为树的节点的孩子顺序 是不固定的。
树的遍历—— 访问每个节点恰好一次
❖ 前序遍历
void preorder ( tree_ptr tree ) { if ( tree ) {
visit ( tree ); for (each child C of tree )
}
❖ 后序遍历
void postorder ( tree_ptr tree ) { if ( tree ) {
for (each child C of tree ) postorder ( C );
visit ( tree ); } }
〖例2〗 计算一个目录的大小。
/usr 1
mark 1
alex 1
A BC D
树的度::=
madxeg (nro)ed ee
no tdreee
例如, degree of this tree = 3.
父节点(Parent) ::= 有子树的节点是 其子树根节点的父节点。
E F G HI J
KL
M
ቤተ መጻሕፍቲ ባይዱ
子节点(Child) ::= 若A节点是B节点的父节点,则B节点是A节点 的子节点,也叫孩子节点。
Unix directory
输出格式: 深度为 di 的文件的名字将被 di 次跳格(tab)缩进后打印出
来。
/usr mark book Ch1.c Ch2.c Ch3.c course cop3530 fall96 syl.r spr97 syl.r sum97 syl.r hw.c alex hw.c bill work course cop3212 fall96 grades p1.r p2.r fall97 p2.r p1.r grades
都被来自根 r 的一条有向边( edge)所连接。
Note: ➢ 子树是不相交的。因此树中的每一个节点都是一棵子
树的根。 ➢ 一棵有N个节点的树中有 N 1 条边。 ➢ 根节点通常画在上方。
§1 预备知识
1. 术语
节点的度(Degree)::= 节点的子树个数。 例如, degree(A) = 3, degree(F) = 0.
A BC D
路径长度::=一条路径的长度为这条路径所 包含的边(分支)的个数。
E F G HI J
ni的深度::= 从根到ni 唯一的路径的长度。 K L
M
Depth(root) = 0.
ni的高度::= 从ni 到一片叶子的最长路径的长度。Height(leaf) = 0, height(D) = 2.
A BC D E F G HI J
KL
M
B
E
F
A
C
G
H
D
I
J
§1 预备知识
因此,每个节点的大小取决于 子树数目。噢,这样并不太好! K L M
§1 预备知识
❖ 儿子-兄弟表示法
Element FirstChild NextSibling
A BC D E F G HI J
KL
M
A
N
B
C
D
N
E
F G HI J
} }
T ( N ) = O( N )
Note: 深度(Depth)是一个内部簿记变量, 而不是主调例程能够期望知道的那种参 数,因此,驱动例程ListDirectory用于 将递归例程和外界连接起来。
void ListDirectory ( DirOrFile D )
{
ListDir( D, 0 );
static void ListDir ( DirOrFile D, int Depth ) {
if ( D is a legitimate entry ) { PrintName (D, Depth ); if ( D is a directory ) for (each child C of D ) ListDir ( C, Depth + 1 );
佛 教
一 般 性 技 术
计 算 机 软 件
电 子 模 拟 计 算
微 型 计… 算 机

计 算 机 的 应 用
宗 教 与 社 会 政

教 与



破 除 迷 信

软程
编操
件 序… 译 作
工语
程系
程言
序统
§1 预备知识
【定义】树是一些节点的集合。这个集合可以是空集;若非 空,则树包含:
(1) 一个被称为根的特殊节点 r; (2) 以及0个或多个非空(子)树 T1, , Tk,每一棵子树的根
兄弟节点(sibling) ::= 具有同一父节点的各节点彼此是兄弟节点。
叶节点(leaf):= 度为0的节点 (没有孩子)。
§1 预备知识
从n1 到 nk 的路径 ::=从结点n1到nk的路径被 定义为一个结点序列n1 , n2 ,… , nk ,对于1 i k, ni是 ni+1的父结点。
第四章 树
§1 预备知识
客观世界中许多事物存在层次关系 ◦ 人类社会家谱 ◦ 社会组织结构 ◦ 图书信息管理
图书





文 学
医 药 卫
农 业 科
工 业 技
生学术



哲 学 理


界 哲

洲 哲
宗 教
论学

电 工 技 术
计 算… 机
建 筑 科 学
水 利 工 程
宗 教 分 析 研 究
宗 教… 理 论 与 概 况
相关文档
最新文档