数据结构基础之二叉排序树的应用

设计算法以构造有n个元素(下标范围从1到n)的二分查找判定树

void bstFromArr(btNode *&T, elementType A[],int low, int high){
	int mid;
	
	//先应用二叉查找的算法 
	if (low < high){
		mid = (low + high) / 2;
		
		T = new btNode;	
		T->data = A[mid];
		T->lChild = NULL;
		T->rChild = NULL;
		
		bstFromArr(T->lChild, A, low, mid-1);//递归创建左子树 
		bstFromArr(T->rChild, A, mid+1, high);//递归创建右子树 

	} 
} 

对给定的二叉排序树,求出在等概论情况下的平均查找长度

//【算法思想】二叉排序树中结点的查找长度就是结点的层次,
//算法可以利用二叉树的一种遍历,统计所有结点的层次数之和sum,再统计出结点总数n
//计算sum/n比值即为ASL。
//以下算法,用中序遍历实现,初始调用inSum(T,1,0,0)

void inSum(btNode* T, int lev, int &n, int &sum)
{
	if(T)
	{
		inSum(T->lChild, lev+1, n, sum);   //累计左子树
		n++;            //累计结点数
		sum=sum+lev;    //累计结点层次数
		inSum(T->rChild, lev+1, n, sum);   //累计右子树	
	}
}

假设其中各结点的值均不相同,设计算法以判断该二叉树是否是二叉排序树

int isBst(btNode *T)
{
	if(T==NULL)     //空树,判定为真
		return 1;
	else if(T->lChild==NULL && T->rChild==NULL)   //只有根结点,判定为真
		return 1;
	else if(T->lChild && T->rChild==NULL)         //只有左子树
	{
		if(T->data<T->lChild->data)    //违反二叉排序树条件
			return 0;
		else
			return isBst(T->lChild);   //递归判定左子树
	}
	else if(T->lChild==NULL && T->rChild)         //只有右子树
	{
		if(T->data>T->rChild->data)    //违反二叉排序树条件
			return 0;
		else
			return isBst(T->rChild);   //递归判定右子树	
	}
	else                                          //左、右子树皆存在
	{
		if(T->data<T->lChild->data || T->data>T->rChild->data)
			return 0;                  //违反二叉排序树条件
		else
			return isBst(T->lChild) && isBst(T->rChild);	
	}                                  //递归判定左子树和右子树
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值