21 计学

1、二叉查找树非空,n个节点

存储的结构为;

struct node{
	int key;
	int n;						//以该节点为根的子树的所有孩子个数 
	struct node *left, *right;
}; 
(1)找到二叉查找树的最小关键字和最大关键字

思路: 最小关键字:最左节点
最大关键字:最右节点

//最左边为最小关键字 
node *search_min(node *root){
	node *t = root;
	while(t->left != NULL){
		t = t->left;
	}
	return t; 
} 

//最右边为最大关键字
node *search_max(node *root){
	node *t = root;
	while(t->right != NULL){
		t = t->right;
	}
	return t;
} 
(2)求二叉树第k小元素,关键字(n>=k>=1),要求时间复杂度不超过log

递归出口: k节点的值大于root节点值,或者k小于1,直接返回null
判断条件:

  1. 左子树长度比较
  2. 左子树个数刚好为k-1,那么根节点就是要找的节点
  3. 左子树个数大于k,必然要在左子树中继续找第k小元素
  4. 左子树个数小于k,在右子树找k-left-1的小元素(减去左子树以及根节点的个数)
//2、求二叉树第k小的元素关键字,时间复杂度为不能超过 log 
int Search_ksmall(node *root, int k){
	if(root == NULL) return 0;				//递归出口
	int leftnum = root->left->n;			//得到以root为根节点的左子树孩子节点个数
	if(k == leftnum + 1) return root->data;	//如果左子树个数为k-1,直接返回根节点
	else if(leftnum >= k) return Search_ksmall(root->left,k); //左子树个数大于k,继续在左子树中找
	else return Search_ksmall(root->right, k-leftnum-1);	  //在右子树中找
	
		  
}//算法的时间复杂度为log2n 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值