数据结构辅导树型结构.docx
- 文档编号:11201777
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:39
- 大小:244.14KB
数据结构辅导树型结构.docx
《数据结构辅导树型结构.docx》由会员分享,可在线阅读,更多相关《数据结构辅导树型结构.docx(39页珍藏版)》请在冰豆网上搜索。
数据结构辅导树型结构
数据结构辅导2012
树形结构部份:
基本知识点:
树的定义及相关术语、树的表示及树的性质。
二叉树的定义、二叉树的性质、满二叉树和完全二叉树的定义、二叉树的顺序存储和链式存储、二叉树的遍历过程、二叉树的线索化过程、哈夫曼树的定义与构造方法以及二叉树与森林之间的转换。
递归的相关概念。
重点:
二叉树的性质、二叉树的遍历(二叉树各种遍历方法及它们所确定的序列之间的关系)、二叉树的线索化方法,构造哈夫曼树。
递归模型、递归算法的执行过程和递归设计思想。
难点:
二叉树上各种算法特别是递归算法的设计和非递归算法的设计。
将递归算法转化为非递归算法。
(重点要求掌握二叉树的二叉链表存储表示结构下的递归算法。
)
树形结构知识体系结构
树
二叉树
二叉树和树
例题:
已知A[n]为整数数组,编写一个递归算法,求n个元素的平均值。
解:
算法如下:
intaverage(intA[],intn)
{if(n==1)returnA[0];
elsereturn(average(A,n-1)*(n-1)+A[n-1])/n;
}
例6.2:
有一个不带头结点的单链表,其结点类型如下:
typedefintElemType;
typedefstructnode
{ElemTypedata;
structnode*next;
}Node;
设计如下递归算法:
(1)求以H为头指针的单链表的结点个数。
(2)正向显示以H为头指针的单链表的所有结点值。
(3)反向显示以H为头指针的单链表的所有结点值。
(4)删除以H为头指针的单链表中值为x的第一个结点。
(5)删除以H为头指针的单链表中值为x的所有结点。
(6)求出以H为头指针的单链表中最大结点值。
(7)求出以H为头指针的单链表中最小结点值。
解:
递归算法分别如下:
(1)intCount(Node*H)
{if(H==0)return0;
elsereturn1+Count(H->next);
}
(2)voidtraverse(Node*H)
{if(H==0)return;
cout<
traverse(H->next);
}
(3)voidtraverseR(Node*H)
{if(H==0)return;
ctraverse(H->next);
out<
}
(4)voiddelFirstx(Node*H,ElemTypex)
{Node*t;
if(H==0)return;
if(H->data==x){t=H;H=H->next;deletet;return;}
delFirstx(H->next,x);
}
(5)voiddelAllx(Node*H,ElemTypex)
{Node*t;
if(H==0)return;
if(H->data==x){t=H;H=H->next;deletet;}
delAllx(H->next,x);
}
(6)ElemTypeMaxv(Node*H)
{ElemTypem;
if(H->next==0)returnH->data;
m=Maxv(H->next);
if(m>H->data)returnm;
elsereturnH->data;
}
(7)ElemTypeMinv(Node*H)
{ElemTypem;
if(H->next==0)returnH->data;
m=Minv(H->next);
if(m
elsereturnH->data;
}
例题一棵完全二叉树上有1001个结点,问其中叶子结点个数是多少?
答案:
501
注:
n0+n1+n2=n,n-1=n1+2n2,n0=n2+1,n1=0或n1=1;
n=2*n0+n1-1,n=1001,故n1=0,n0=501。
例题一棵有124个叶子结点的完全二叉树中,最多有多少个结点?
答案:
248
注:
n=n0+n1+n2=n0+n1+n0-1=2*n0+n1-1,n1最多为1。
n=2*124=248。
例题设有13个值,用它们组成一棵哈夫曼树,问该哈夫曼树有多少个结点?
答案:
25
注:
有m个叶结点的哈夫曼树共有2m-1个结点。
2*13-1=25。
例题问8层完全二叉树至少有多少个结点?
答案:
128
注:
1+2+4+8+16+32+64+1=128
例题问拥有100个结点的完全二叉树的最大层数是多少?
答案:
7
例题已知二叉树有50个叶子结点,则该二叉树的结点总数至少是多少?
答案:
99
注:
n0=n2+1;n0=50,n2=49,n1=0或1,n=n0+n1+n2=99。
例题:
已知二叉树用二叉链表表示,写出二叉树的先序遍历、中序遍历、后序遍历的递归算法。
解:
设存储结构如下:
structBitreeNode
{ElemTypedata;
BitreeNode*left,*right;
};
先序遍历二叉树的的方法是:
先访问根结点,然后按先序遍历方法访问左子树,再按先序遍历方法访问右子树。
则先序遍历的递归算法如下:
voidPreOrder(BitreeNodeode*Bt)
{if(Bt){cout<
中序遍历二叉树的方法是:
先按中序遍历方法访问左子树,然后访问根结点,再按中序遍历方法访问右子树。
则中序遍历的递归算法如下:
voidInOrder(BitreeNode*Bt)
{if(Bt){InOrder(Bt->left);cout<
后序遍历二叉树的方法是:
先按后序遍历方法访问左子树,然后按后序遍历方法访问右子树,最后访问根结点。
则后序遍历的递归算法如下:
voidPostOrder(BitreeNode*Bt)
{if(Bt){PostOrder(Bt->left);PostOrder(Bt->right);cout<
例题:
已知二叉树用二叉链表表示,编写算法求二叉树的结点个数。
解:
设存储结构如下:
structBitreeNode
{ElemTypedata;
BitreeNode*left,*right;
};
二叉树的结点个数包括三部分:
左子树的结点个数、根结点、右子树的结点个数。
因此二叉树的结点个数等于这三部分相加。
求二叉树的结点个数的算法如下:
intNodes(BitreeNode*Bt)
{if(!
Bt)return0;
elsereturn1+Nodes(Bt->left)+Nodes(Bt->right);
}
例题:
假设二叉树用二叉链表表示,分别编写算法求叶结点的个数、求度为1的结点的个数、求度为2的结点的个数。
解:
设存储结构如下:
structBitreeNode
{ElemTypedata;
BitreeNode*left,*right;
};
求二叉树的叶结点的个数的算法如下:
intleafs(BitreeNode*Bt)
{if(!
Bt)return0;
elseif(!
Bt->left&&!
Bt->right)return1;
elsereturnlefts(Bt->left)+lefts(Bt->right);
}
求二叉树的度数为1的结点个数的算法如下:
intNodesOne(BitreeNode*Bt)
{if(!
Bt)return0;
elseif((!
Bt->left&&Bt->right)||(Bt->left&&!
Bt->right))
return1+NodesOne(Bt->left)+NodesOne(Bt->right)
elsereturnNodesOne(Bt->left)+NodesOne(Bt->right);
}
求二叉树的度数为2的结点个数的算法如下:
intNodesTwo(BitreeNode*Bt)
{if(!
Bt)return0;
elseif(Bt->left&&Bt->right)return1+NodesTwo(Bt->left)+NodesTwo(Bt->right);
elsereturnNodesTwo(Bt->left)+NodesTwo(Bt->right);
}
例题:
假定二叉树采用二叉链存储结构,设计一个算法,删除该二叉树,并释放所有的结点。
解:
设存储结构如下:
structBitreeNode
{ElemTypedata;
BitreeNode*left,*right;
};
删除二叉树的算法如下:
voiddeleteBitree(BitreeNode*Bt)
{if(Bt){deleteBitree(Bt->left);deleteBitree(Bt->right);delete(bt);bt=0;}}
例题:
编写一个算法,将用二叉链表表示的二叉树的所有结点的左右子树交换。
解:
设存储结构如下:
structBitreeNode
{ElemTypedata;
BitreeNode*left,*right;
};
算法如下:
voidexchange(BiTreeNode*&T)
{if(T==0)return;
BiTreeNode*temp;
temp=T->left;T->left=T->right;T->right=temp;
exchange(T->left);exchange(T->right);
}
例题:
写一个算法,建立二叉树的二叉链表。
解:
(最简单的算法是用扩充先序序列)
假设二叉树的存储结构是:
TypedefcharElemType;
typedefstructBitreeNode
{ElemTypedata;
BitreeNode*left,*right;
}BitreeNode,*Bitree
假设输入的是二叉树的扩充先序序列,如果某个子树为空则用特殊的标志符号。
假设二叉树的结点用字符来表示,空的子树用特殊符号#来表示,则算法如下:
voidcreat_bitree(Bitree&T)
{//按扩展的先序序列输入结点,输入‘#’表示空。
ElemTypech;cin>>ch;
if(ch==’#’)T=0;
else
{T=newBitreeNode;T->data=ch;
creat_bitree(T->left);
creat_bitree(T->right);
}
}
例题:
已知一棵二叉树的前序和中序序列,画出该二叉树并求其后序序列。
前序序列:
A,B,C,D,E,F,G,H,I,J
中序序列:
C,B,A,E,F,D,I,H,J,G
例题:
已知一棵二叉树的中序序列和后序序列,画出该二叉树并写出其前序序列。
中序序列:
C,B,A,E,F,D,I,H,J,G
后序序列:
C,B,F,E,I,J,H,G,D,A
例题:
假设一棵二叉树的先序序列是EBADCFHGIKJ和中序序列是ABCDEFGHIJK。
请画出该二叉树并写出其后序序列。
解:
该二叉树是
该二叉树的后序序列是:
ACDBGJKIHFE。
例题:
假设一棵二叉树的中序序列为DCBGEAHFIJK和后序序列为DCEGBFHKJIA。
请画出该二叉树并写出其先序序列。
例题:
已知二叉树的先序序列是ABDEHCFIG,中序序列是DBHEAFICG,请画出该二叉树。
例题:
假设一棵二叉树的层次序列为ABCDEFGHIJ和中序序列为DBGEHJACIF。
请画出该二叉树并写出其先序序列和后序序列。
例题:
己知一棵二叉树先序遍历的结果是ABCDEFG,中序遍历的结果是CBDAFGE。
(1)画出此二叉树;
(2)写出其后先序遍历的结果。
(答案:
后序序列:
CDBGFEA)
解:
根据二叉树的先序序列和中序序列,该二叉树是:
该二叉树的后序序列是:
CDBGFEA。
例题:
从空树起,依次插入关键词{37,50,42,18,48,12,56,30,23},建立一棵二叉排序树,然后删除结点37,分别画出该二叉树及删除37之后的二叉树。
例题:
输入下列整数序列,画出建立的二叉排序树,并画出删除79后的二叉排序树。
{79,95,64,50,21,99,67,85,65}
解:
建立和二叉排序树是:
删除结点79后的二叉排序树是:
例题:
输入下列整数序列,画出建立的二叉排序树,并画出删除70后的二叉排序树。
(70,88,64,55,23,100,67,80,58)。
例题:
从空树起,依次插入关键词{45,37,48,25,17,67,41,40,54,57,44,49},建立一棵二叉排序树,请画出该二叉排序树。
例题:
从空树起,依次插入关键词{34,37,58,25,17,16,11,70,24,27,31,19},建立一棵二叉排序树,请画出该二叉排序树。
解:
从空树起,依次插入相应关键字,建立的二叉排序树是:
例题:
对于下面给出的数据序列,构造一棵哈夫曼树,并求出其带权路径长度。
{12,15,6,7,10,18}
例题:
对于下面给出的数据序列,构造一棵哈夫曼树,并求出其带权路径长度。
{18,14,13,7,8,17}
解:
构造的哈夫曼树如下:
由此求出其带权路径长度是:
WPL=(7+8+13+14)*3+(17+18)*2=196
例题:
设给定权集散地W={5,6,7,12,13,15},试构造关于W的一棵哈夫曼树,并求其加权路径长度WPL。
例题:
已知字符:
C1,C2,C3,C4,C5,C6的权分别为:
17,5,16,4,8,11,请构造相应的赫夫曼树,并给出相应字符的赫夫曼编码。
(答案:
c1:
10,c2:
1111,c3:
01,c4:
1110,c5:
110,c6:
00)
例题:
已知字符:
A,B,C,D,E,F的权分别为:
4,5,8,11,16,17,请构造相应的赫夫曼树,并给出相应字符的赫夫曼编码。
例题:
已知字符:
A,B,C,D,E,F的权分别为:
18,14,13,7,8,17,请构造相应的赫夫曼树,并给出相应字符的赫夫曼编码。
解:
构造的哈夫曼树如下:
按照左子树对应于0,右子树对应于1的方法,得到各字符的哈夫曼编码分别是:
A(18):
10
B(14):
111
C(13):
110
D(7):
000
E(8):
001
F(17):
01
例题:
[选择题]
1、树中所有结点的度等于所有结点数加______。
(A)0(B)1(C)-1(D)2
2、在一棵树中,______没有前驱结点。
(A)树枝结点(B)叶子结点(C)树根结点(D)空结点
3、在一棵二叉树的二叉链表中,空指针域数等于非空指针域数加_________。
(A)2(B)1(C)0(D)-1
4、在一棵具有32个结点的二叉树中,所有结点的空子树个数等于_________。
(A)32(B)31(C)33(D)64
5、在一棵具有35个结点的完全二叉树中,该树的深度为_________。
(A)5(B)6(C)7(D)8
6、利用n个结点生成的哈夫曼树中共有_________个结点。
(A)n(B)n+1(C)2n(D)2n-1
7、利用{3,6,8,12}这四个值作为叶子结点的权,生成一棵哈夫曼树,该树的带权路径长度为_________。
(A)55(B)29(C)58(D)38
8、利用{3,6,8,12,5,7}这六个值作为叶子结点的权,生成一棵哈夫曼树,该树的深度为_________。
(A)3(B)4(C)5(D)6
9、若二叉树采用顺序方法存储,则下列4种运算中,_________最容易实现。
(A)先序遍历二叉树(B)层次遍历二叉树
(C)判断二个结点是否在同一层上(D)根据结点的值查找其存储位置
10、设m、n为一棵二叉树上的两个结点,在中序遍历时,n在m前的条件是_________。
(A)n在m右方(B)n是m祖先(C)n在m左方(D)n是m子孙
11、线索二叉树是一种_________结构。
(A)逻辑(B)逻辑和存储(C)物理(D)线性
12、按照二叉树的定义,具有3个结点的二叉树有_________种。
(A)3(B)4(C)5(D)6
13、具有10个叶子结点的二叉树中,有_________个度为2的结点。
(A)8(B)9(C)10(D)11
14、深度为5的二叉树中至多有_________个结点。
(A)10(B)16(C)31(D)32
15、某二叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树一定是_________。
(A)空树或只有一个结点(B)完全二叉树
(C)二叉排序树(D)高度等于其结点数
16、任何一棵二叉树的叶子结点在先序、中序、后序遍历序列中其相对次序_________。
(A)不会发生改变(B)发生改变(C)不能确定(D)以上都不对
17.一棵5层满二叉树中,结点总数为()个。
(A)33(B)32(C)31(D)30
18.设有6个结点的无向图,该图至少应有()条边才能确保是一个连通图。
(A)5(B)6(C)7(D)8
19、二叉树若用顺序方法存储,则下列4种运算中的______最容易实现。
(A)先序遍历二叉树(B)判断两个结点是否在同一层上
(C)层次遍历二叉树(D)根据结点的值查找其存储位置
例题:
己知完全二叉树的第7层有8个结点(根为第0层),则其叶子结点数是
68。
例题:
设二叉树有N个结点,采用二叉链表存储结构,有N-1个非空指针域,有N+1个空的批针域。
例题:
一棵深度为5的二叉树(根的层次为0),最多有31个结点。
例题:
具有100个结点的完全二叉树的深度是7。
例题:
己知完全二叉树的第八层有8个结点(根为第一层),则其叶子结点数
是68。
例题:
对于任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,
则n0=n2+1。
例题:
有m个叶结点的哈夫曼树所具有的结点数为2m+1。
例题:
若某二叉树的叶子结点数为1,则其先序序列和后序序列一定相反。
例题:
有64个结点的完全二叉树的深度为7。
例题:
按照二叉树的定义,具有三个结点的二叉树有5种。
例题:
高度为4,度为5的树中,至少有8个结点,至多有156个结点。
例题:
深度为N的完全二叉树至少有2N-1个结点,至多有2N-1个结点,若按自上而下,从左至右次序给结点编号(从1开始),则编号最小的叶子结点的编号是2N-1。
例题:
向二叉排序树中插入一个结点,所需比较的次数可能大于此二叉排序树的高度。
对吗?
例题:
完全二叉树中,若一个结点没有左儿子,由必是树叶。
对吗?
答案:
正确。
例题:
是否存在这样的二叉树,对它采用任何次序的遍历,其结果相同?
答案:
存在。
例题:
删除二叉排序树一个结点,然后再重新插入进去,得到的二叉排序树与原来的二叉排序树相同吗?
答案:
不一定相同。
例题:
按照二叉树的定义,具有三个结点的二叉树有多少种?
答案:
有五种。
例题:
二叉排序树中,新结点总是作为树叶来插入的。
对吗?
答案:
正确。
例题:
二叉树与度为2的树有差别吗?
答案:
有差别。
例题:
二叉树的顺序存储,最容易实现的运算之一是层次遍历运算。
说明:
二叉树的五种情形:
(1)空二叉树,
(2)只有一个根结点,(3)根结点和左子树,(4)根结点和右子树,(5)根结点和左右子树
说明:
三个结点的二叉树的情形:
图结构部份:
基本知识点:
图的基本概念、图的存储结构(主要是邻接矩阵和邻接表)、图的遍历算法(深度优先遍历和广度优先遍历)、图的生成树和最小生成树(Prim算法和Kruskal算法)、最短路径(Dijkstra算法和Floyd算法)、关键路径和拓扑排序。
重点:
图的各种存储结构和遍历算法(递归和非递归算法)设计,构造最小生成树,生成最短路径、生成图的关键路径,拓扑排序的应用。
难点:
图的遍历算法和图的各种复杂算法的设计。
例题:
给定一个带权图,按照普里姆(Prim)算法,从顶点v1出发生成最小生成树,按生成次序写出各条边。
例题:
若连通图G的顶点个数为n,则G的生成树的边数为n-1。
例题:
有n个结点的强连通有向图G至少有n条弧。
例题:
有n个结点的无向图的边数最多是(n(n-1)/2)。
例题:
有20个结点的强连通有向图G至少有21条弧。
例题:
求最短路径的DIJKSTRA算法的时间复杂度为O(n2)。
例题:
一棵树中的叶子结点数与其对应的二叉树中的叶子结点数一般情况下是不一样的。
例题:
有向图用邻接矩阵表示后,顶点i的入度等于邻接矩阵中第i列的元素个数。
例题:
具有4个顶点的无向完全图有6条边。
例题:
在一个图中,所有顶点的度数之和等于所有边数的2倍。
例题:
N个顶点的连通图至少有N-1条边。
例题:
图的广度(宽度)优先遍历类似于树(或二叉树)的层次遍历。
例题:
将一棵树转换为二叉树表示后,该二叉树的根结点没有右子树。
例题:
存储图的邻接矩阵中,邻接矩阵的大小与图的顶点个数有关,与图的边数无关。
例题:
可以进行拓扑排序的有向图一定是无环图。
如果一个有向图,无法进行拓扑排序,则一定是有环的图。
例题:
在一个有向图的邻接表中,如果某个顶点的链表为空,则该顶点的出度一定为0。
例题:
在一个有向图的逆邻接表中,如果某个顶点的链表为空,则该顶点的入度一定为0。
例题:
如果有向图G=(V,E)的拓扑序列唯一,则图中必定仅有一个顶点的入度为0,一个顶点的出度为0。
例题:
给出一个有向图或无向图的邻接矩阵,请画出该图,或画出该图的邻接表表示。
例题:
给出一个无向图的邻接矩阵,请画出该图,或画出该图的邻接表(逆邻接表)表示。
例题:
如果一个有向图G=(V,E)的邻接矩阵如下:
请画出该有向图。
解:
设该有向图对应的顶点分别是0,1,2,3,4,则该有向图是:
例题:
设一个无向图的邻接矩阵如下:
(1)请画出该无向图。
(2)画出该无向图的邻接表。
例题:
给出一个图G如下:
(1)请写出其邻接矩阵。
(2)请画出其邻接表。
例题:
给定一个图如下:
(1)请写出其邻接矩阵。
(2)请画出其邻接表。
例题:
给定一个有向图如下:
(1)请写出该图的邻接矩阵。
(2)请画出该图的邻接表。
(3)请画出该图的逆邻接表。
解:
(1)该图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 辅导 结构