问题 填空题

阅读下列说明、图和C代码,将应填入 (n) 处的字句写在对应栏内。

[说明1]

B树是一种多叉平衡查找树。一棵m阶的B树,或为空树,或为满足下列特性的m叉树。

①树中每个结点至多有m棵子树;

②若根结点不是叶子结点,则它至少有两棵子树:

③除根之外的所有非叶子结点至少有[m/2]棵子树:

④所有的非叶子结点中包含下列数据信息:

(n,A0,K1,A1,K2,A2,…,K11,A11)

其中,K(i=1,2,…,n)为关键字,且K<Ki+1(i=1,2,…,n-1);Ai(i=0,1,…,n)为指向子树根结点的指针,且指针Ai-1所指子树中所有结点的关键字均小于Ki,Ai+1所指子树中所有结点的关键字均大于Ki,n为结点中关键字的数目。

⑤所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)。

例如,一棵4阶B树如图21-4所示(结点中关键字的数目省略)。

B树的阶m、Bool类型、关键字类型及B树结点的定义如下。

#define M 4 /*B树的阶数*/

typedef enumFALSE=0,TRUE=1bool;

typedef int E1emKeyType;

typedef struct BTreeNode

int numkeys; /*结点中关键字的数目*/

struct BTreeNode *parent;/*指向父结点的指针,树根的父结点指针为空*/

Struct BTreeNode *A[M]; /*指向子树结点的指针数组*/

ElemKeyType K[M]; /*存储关键字的数组,K[0]闲置不用*/

BTreeNode;

函数SearchBtree(BTreeNode *root,ElemKeyType akey,BTreeNode **ptr)的功能是:在给定的一棵m阶B树中查找关键字akey所在结点,若找到则返回TRUE,否则返回FALSE。其中,root是指向该m阶B树根结点的指针,参数ptr返回akey所在结点的指针,若akey不在该B树中,则ptr返回查找失败时空指针所在结点的指针。例如,在如图21-4所示的4阶B树中查找关键字akey时,ptr返回指向结点e的指针。

注:在结点中查找关键字akey时采用二分法。

[本题函数]

bool SearchBtree(BTreeNode *root,ElemKeyType akey,BTreeNode **ptr)

int lw,hik mid;

BTreeNode *P=root;

*ptr=NULL;

while(p)

lw=1;hi= (1)

while(lw<=hi)

mid=(lw+hi)/2;

if(p->K[mid]==akey)

*ptr=p;

return TRUE;

else

if( (2) )

hi=mid-1;

else

lw=mid+1;

*ptr=p;

p= (3)

return FALSE;

[说明2]

在m阶B树中插入一个关键字时,首先在最接近外部结点的某个非叶子结点中增加一个关键字,若该结点中关键字的个数不超过m-1,则完成插入;否则,要进行结点的“分裂”处理。所谓“分裂”,就是把结点中处于中间位置上的关键字取出来并插入其父结点中,然后以该关键字为分界线,把原结点分成两个结点。“分裂”过程可能会一直持续到树根,若树根结点也需要分裂,则整棵树的高度增1。

例如,在如图21-4所示的B树中插入关键字25时,需将其插入结点e中,由于e中已经有3个关键字,因此将关键字24插入结点e的父结点b中,并以24为分界线将结点e分裂为e1和e2两个结点,结果如图21-5所示。

函数Isgrowing(BTreeNode* root,ElemKeyType akey)的功能是:判断在给定的m阶B树中插入关键字akey后,该B树的高度是否增加,若增加则返回TRUE;否则返回FALSE。其中,root是指向该m阶B树根结点的指针。

在函数Isgrowing中,首先调用函数SearchBtree,查找关键字akey是否在给定的m阶B树中,若在则返回FALSE(表明无须插入关键字akey,树的高度不会增加);否则,通过判断结点中关键字的数目考察插入关键字akey后该B树的高度是否增加。

[本题函数]

bool Isgrowing(BTreeNode* root,ElenlKeyType akey)

BTreeNode *t,*f;

if (!SearchBtree( (4) ))

t=f;

while( (5) )

t=t->parent;

if(!t)

return TRUE:

return FALSE:

(5)处填()。

答案

参考答案:t&&t->numkeys==M-1,或其等价形式

阅读理解与欣赏

阅读下面的文言文,完成下列小题。

程信,字彦实,其先休宁人,洪武中戍河间,因家焉。信举正统七年进士,授吏科给事中。

也先犯京师,信督军守西城。都督孙镗击也先失利,欲入城,信不纳,督军从城上发箭助之。镗战益力,也先遂却。

景泰元年请振畿辅饥民,复河间学官、生徒因用兵罢遣者,皆报可。

明年二月出为山东右参政,督饷辽东。巡抚寇深奏盗粮一石以上者死,又置新斛视旧加大,属信钩考。信立碎之,曰:“奈何纳人于死!”深由是不悦信。

天顺元年,擢信太仆卿。京卫马旧多耗,信定期征之。三营大将言太仆苛急,请改隶兵部。信言:“高皇帝令太仆马数,勿使人知。若隶兵部,马登耗,太仆不得闻。脱有警马不给谁任其咎?”帝是之,乃隶太仆如故。

明年,改左佥都御史,巡抚辽东。都指挥夏霖恣不法,佥事胡鼎发其四十罪,信以闻,下霖锦衣狱。门达言信不当代奏,时寇深方掌都察院,修前郤,劾信。征下诏狱,降南京太仆少卿。母忧归。

成化元年起兵部,寻转左。四川戎县山都掌蛮数叛,陷合江等九县。廷议发大军讨之。以襄城伯李瑾充总兵官,进信尚书,提督军务。至永宁,分道进。信与瑾居中节制。转战六日,破寨七百五十余。前后斩首四千五百有奇,俘获无算。录功,进兼大理寺卿,与白圭同莅兵部。信欲有为,而阻于圭,数称疾。

改南京兵部,参赞机务。明年致仕,逾年卒。赠太子少保,谥襄毅。

信征南蛮时,制许便宜从事。迄班师,未尝擅赏戮一人。曰:“刑赏人主大柄也不得已而假之人。幸而事集辄自专非人臣所宜。”在南京,守备臣欲预钱谷讼狱事,信曰:“守备重臣,所以谨非常也。若此,乃有司职耳。”论者韪之。

(节选自《明史·列传第六十》,有删改)

小题1:对下列句子中加点的词的解释,不正确的一项是(  )

A.信正统七年进士举:考中。

B.又置新斛旧加大视:比照。

C.信钩考属:隶属。

D.论者之韪:认为……正确。小题2:以下各组句子中,全都表明程信为官正直的一组是(  )

①信不纳,督军从城上发箭助之 ②信立碎之,曰:“奈何纳人于死!”

③京卫马旧多耗,信定期征之 ④信以闻,下霖锦衣狱 ⑤信欲有为,而阻于圭,数称疾 ⑥迄班师,未尝擅赏戮一人

A.①③④

B.③⑤⑥

C.①②⑤

D.②④⑥小题3:下面对原文有关内容的概括和分析,不正确的一项是 (  )

A.程信督战果敢。也先侵犯京城时,程信不让攻击也先失利的都督孙镗撤军进城,而是督率军队从城头上射箭发炮帮助他,没有退路的孙镗越战越勇,击退了也先。

B.程信恪尽职守。程信提出的赈济京城附近饥民,恢复河间被罢免学官的官职和被遣送生徒的学业等建议,都得到皇上许可;任太仆卿时,他定期征用马匹,及时掌握马匹的增减情况。

C.程信平叛有功。朝廷发大军征讨四川戎县蛮人叛乱,程信与总兵官李瑾居中调度,分路进军,转战六天,破寨七百五十多座,斩杀四千五百多人,俘获无数,平定了叛乱。

D.程信能识大体。在南京任上,守备大臣想干预钱粮的管理和诉讼案件,程信认为守备重臣应当非常谨慎,不要越俎代庖,行使主管官吏的职责。

填空题