21 计学

本文介绍了如何在非空的二叉查找树中,不使用递归和栈来找到最小和最大关键字。通过迭代方式,分别从左子树和右子树开始,找到最左下和最右下的节点以获取最小和最大关键字。同时,提出了寻找第k小元素的关键字的算法,通过比较节点的子树大小进行分情况讨论,确保在O(logn)的时间复杂度内完成查找。
摘要由CSDN通过智能技术生成

算法题:

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),要求时间复杂度不超过log2^{^{n}}

思路:

分类讨论  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值