问答题 在平衡二叉树中的每个结点上增设一个Lsize域,其值为它的左子树中的结点个数加1,试写一个时间复杂度为O(log n)的算法,确定树中第k个结点的位置。

【正确答案】A 二叉排序树中第k个结点,即为二叉排序树中序序列中顺序号为k的结点,根结点的Lsize域中存放的是根结点的顺序号。要确定二叉排序树中第k个结点,先需将k与根结点的顺序号进行比较,若相等,则找到;若k小于根结点的顺序号,k继续与根的左孩子结点的顺序号比较,依次类推。(注意,右孩子结点的顺序号等于根结点的顺序号与右孩子结点的Lsize域值之和。)由于查找过程中不超过树的高度,故其算法复杂度为O(log n)。
typedef struct Node{
int key:
struct Node* lchild,*rchild:
int Lsize
}BSNode;
BSNode* Locate(BSNode* T,int k)
{
int j,i=0;
BSNode* p=T;
while(p)
{
j=i+p->Lsize;
if(j==k) return p;//找到
if(j>k) p=p->lchild;
else{
i+=p->Lsize;
p=P->rchild;
}
}
return NULL:
}
【答案解析】