阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 二叉查找树又称为二叉排序树,它或者是一棵空树,或者是具有如下性质的二叉树。 (1)若它的左子树非空,则左子树上所有结点的值均小于根结点的值。 (2)若它的右子树非空,则右子树上所有结点的值均大于根结点的值。 (3)左、右子树本身就是两棵二叉查找树。 二叉查找树是通过依次输入数据元素并把它们插入到二叉树的适当位置上构造起来的,具体的过程是:每读入一个元素,建立一个新结点,若二叉查找树非空,则将新结点的值与根结点的值相比较,如果小于根结点的值,则插入到左子树中,否则插入到右子树中;若二叉查找树为空,则新结点作为二叉查找树的根结点。 根据关键码序列{46,25,54,1 3,29,91}构造一个二叉查找树的过程如图4—1所示。 设二叉查找树采用二叉链表存储,结点类型定义如下: typedef int KeyType; typedef struct BSTNode{ KeyType key; struct BSTNode*left,*right ; }BSTNode,*BSTree; 图4一1(g)所示二叉查找树的二叉链表表示如图4-2所示。
【正确答案】正确答案:(1)father=NULL 或father=0或等价形式 (2)p->key!=kword 或等价形式 (3)P 或p!=0或p!=NULL (4)sizeof(BSTNode)或等价形式 (5)*rootptr (6)father->left=P (7)father->right=P
【答案解析】解析:本题考查C程序设计的基本结构和数据结构的实现。 根据二叉查找树的定义,其左子树中结点的关键码均小于树根结点的关键码,其右子树中结点的关键码均大于根结点的关键码,因此,将一个新关键码插入二叉查找树时,若等于树根或某结点的关键码,则不再插入,若小于树根,则将其插入到左子树中,否则将其插入到右子树中。 根据注释,空(1)处需将father设置为空指针,应填入“father=NULL”或其等价形式。 空(2)所在语句用于查找新关键码的插入位置,p指向当前结点。查找结果为两种:若找到,则p指向的结点的关键码等于新关键码,若没有找到,则p得到空指针值。因此空(2)处应填入“p->key!=kword”或其等价形式,在得到结果前使得查找过程可以继续,并且用father记录新插入结点的父结点指针。 空(3)处应填入“p”或其等价形式,表明查找到了与kword相同的结点,无须再插入该关键码。 空(4)处应填入“sizeof(BSTNode)”,在申请新结点空间时提供结点所需的字节数。 空(5)处应填入“*rootptr”,使得新结点作为树根结点时,树根结点的指针作为二叉链表的标识能得到更新。 根据注释,空(6)应填入“father->left=P”、空(7)应填入“father->right=P”。