for(t=1;t<=;t++)
position[[t].col]++; /*计算每一列的非零元素的个数*/ ol;
q=position[col]; B->data[q].row=[p].col; B->data[q].col=[p].row; B->data[q].e=[p].e; Position[col]++; } } }
画出下面广义表的两种存储结构图示: ((((a), b)), ((( ), d), (e, f))) 【解答】
求下列广义表运算的结果:
(6) HEAD[((a,b),(c,d))]; (a,b) (7) TAIL[((a,b),(c,d))]; ((c,d)) (8) TAIL[HEAD[((a,b),(c,d))]]; (b) (9) HEAD[TAIL[HEAD[((a,b),(c,d))]]]; b (10) TAIL[HEAD[TAIL[((a,b),(c,d))]]]; (d)
第六章 树和二叉树
习 题
1.试分别画出具有3个结点的树和3个结点的二叉树的所有不同形态。 2.对题1所得各种形态的二叉树,分别写出前序、中序和后序遍历的序列。
3.已知一棵度为k的树中有n1个度为1的结点,n2个度为2的结点,……,nk个度为k的结点,则该树中有多少个叶子结点? [提示]:参考 性质3
∵ n=n0 + n1 + …… + nk
B=n1 + 2n2 + 3n3 + …… + knk n= B + 1
∴ n0 + n1 + …… + nk = n1 + 2n2 + 3n3 + …… + knk + 1 ∴ n0 = n2 + 2n3 + …… + (k-1)nk + 1
4. 假设一棵二叉树的先序序列为EBADCFHGIKJ,中序序列为ABCDEFGHIJK,请画出该二叉树。 [提示]:参考
5. 已知二叉树有50个叶子结点,则该二叉树的总结点数至少应有多少个? [提示]: [方法1]
(1)一个叶子结点,总结点数至多有多少个?
结论:可压缩一度结点。
(2)满二叉树或完全二叉树具有最少的一度结点
(3)可能的最大满二叉树是几层?有多少叶结点?如何增补?
2<50<2
可能的最大满二叉树是6层 有 2 = 32个叶结点
假设将其中x个变为2度结点后,总叶结点数目为50 则:2x + (32 – x) = 50 得:x = 18
此时总结点数目= ( 2 – 1) + 18×2
[方法2]
假设完全二叉树的最大非叶结点编号为m, 则最大叶结点编号为2m+1, (2m+1)-m=50 m=49
总结点数目=2m+1=99
[方法3]
由性质3:n0=n2+1 即:50=n2+1 所以:n2=49
令n1=0得:n= n0 + n2=99
6. 给出满足下列条件的所有二叉树:
6
55
6
(1)前序和中序相同 (2)中序和后序相同 (3)前序和后序相同 [提示]:去异存同。
(1)D L R 与L D R 的相同点:D R,如果无 L,则完全相同, 如果无 LR,…。 (2)L D R 与L R D 的相同点:L D,如果无 R,则完全相同。 (3)D L R 与L R D 的相同点:D,如果无 L R,则完全相同。
(如果去D,则为空树)
7. n个结点的K叉树,若用具有k个child域的等长链结点存储树的一个结点,则空的Child域有多少个? [提示]:参考
8.画出与下列已知序列对应的树T:
树的先根次序访问序列为GFKDAIEBCHJ; 树的后根次序访问序列为DIAEKFCJHBG。 [提示]:
(1)先画出对应的二叉树
(2)树的后根序列与对应二叉树的中序序列相同
9.假设用于通讯的电文仅由8个字母组成,字母在电文中出现的频率分别为:
,,,,,,,
(1)请为这8个字母设计哈夫曼编码, (2)求平均编码长度。
10.已知二叉树采用二叉链表存放,要求返回二叉树T的后序序列中的第一个结点的指针,是否可不用递归且不用栈来完成?请简述原因. [提示]:无右子的“左下端”
11. 画出和下列树对应的二叉树:
12.已知二叉树按照二叉链表方式存储,编写算法,计算二叉树中叶子结点的数目。 13.编写递归算法:对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间。 [提示]:
[方法1]:(1)按先序查找;(2)超前查看子结点(3)按后序释放; void DelSubTree(BiTree *bt, DataType x) {
if ( *bt != NULL && (*bt) ->data==x ) { FreeTree(*bt); *bt =NULL; }
else DelTree( *bt, x)
void DelTree(BiTree bt, DataType x) { if ( bt )
{ if (bt->LChild && bt->LChild->data==x)
{ FreeTree(bt->LChild); bt->LChild=NULL; }
if (bt->RChild && bt->RChild->data==x)
{ FreeTree(bt->RChild); bt->RChild=NULL; }
DelTree(bt->LChild, x); DelTree(bt->RChild, x); }
}
[方法2]:(1)先序查找;(2)直接查看当前根结点(3)用指针参数; [方法3]:(1)先序查找;(2)直接查看当前根结点