算法题:
1.一个二叉查找树,已经告诉非空,有n个节点,节点结构已经给出
struct node{
int key;
int n;//n是以该节点为根的子树的所有孩子个数
struct node *left,*right;
}
(1)求这个二叉查找树节点的最小关键字和最大关键字是什么?(不能用递归和栈)
//在一颗二叉树排序树中,最左下结点即为关键字最小的结点,最右下结点即为关键字最大的结点。
int MinKey(struct node *tree)
{
while(tree->left!=NULL)
{
tree=tree->left;
}
return tree->key;
}
int MaxKey(struct node *tree)
{
while(tree->right!=NULL)
{
tree=tree->right;
}
return tree->key;
}
(2)求这个二叉树第k小的元素关键字(n>=k>=1),要求时间复杂度不超过。
思路:
分类讨论 t->left为空时,看右子树(1)若t->right非空且k==1,t即是第k小的元素,查找成功
(2)若t->right非空且k!=1,则第k小的元素在t的右子树
t->left非空时,看左子树(1)t->left->n+1==k,t即为第k小的元素,查找成功
(2) t->left->n+1>k,第k小的元素必在t的左子树
(3)t->left->n+1<k,第k小的元素必在右子树,在右子树中寻找第k-(t->left->n+1)小的元素。
int Search_small(struct node *t,int k)//在以t为根的子树上寻找第k小的元素关键字
{
if(k<1||k>t->n)return NULL;
if(t->left==NULL)
{
if(k==1)return t->key;
else return Search_small(t->right,k-1);
}
else
{
if(t->left->n+1==k)return t->key;
if(t->left->n+1>k)return Search_small(t->left,k);
if(t->left->n+1<k)return Search_small(t->right,k-(t->left->n+1));
}
}
//算法时间复杂度为log2n