9.40在平衡二叉排序树的每个结点中增设一个lsize域,其值为它的左子树中的结点数加1。试写一时间复杂度为O(logn)的算法,确定树中第k小的结点的位置。

#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct TNode{
	elemtype data;
	TNode *rchild,*lchild,*parent;
	int lsize;
}TNode,*Bitree;

void createT(Bitree &bt,Bitree pre){      
	int c;
	scanf("%d",&c);
	if(c!=-1){
		bt=(TNode*)malloc(sizeof(TNode));
		bt->data=c;
		bt->lsize=0;
		bt->parent=pre;
		createT(bt->lchild,bt);
		createT(bt->rchild,bt);
	}else{
		bt=NULL;
	}
}

int addLsize(Bitree bt){
	int lnum,rnum;
	if(bt){
		lnum=addLsize(bt->lchild);
		rnum=addLsize(bt->rchild);
		
		bt->lsize=lnum;
		return lnum+rnum+1;
	}else
		return 0;
	
}

void printT(Bitree bt){
	if(bt){	
		printT(bt->lchild);
		printf("%d:%d \n",bt->data,bt->lsize);
		printT(bt->rchild);
	}
}

int search(Bitree bt,int k){
	if(bt->lsize==k-1)
		return bt->data;
	else if(bt->lsize>k-1)
		return search(bt->lchild,k);
	else
		return search(bt->rchild,k-bt->lsize-1);

}

int main(){                  //5 3 2 1 -1 -1 -1 4 -1 -1 7 6 -1 -1 -1
	Bitree bt;
	createT(bt,NULL);      
	addLsize(bt);
	printf("输出lsize:\n");
	printT(bt);
	putchar(10);
	int a; 
	for(a=1;a<=7;a++){
			int m=search(bt,a);
		printf("第%d小的是%d\n",a,m);
	}

	return 0;
}


输入:

5 3 2 1 -1 -1 -1 4 -1 -1 7 6 -1 -1 -1

输出:

输出lsize:
1:0
2:1
3:2
4:0
5:4
6:0
7:11小的是12小的是23小的是34小的是45小的是56小的是67小的是7
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值