【算法导论】【随机二叉搜索树】

我们已经证明了二叉搜索树上的每个基本操作都能在O ( h ) O(h)O(h)时间内完成,其中h hh为这棵树的高度。然而,随着元素的插入和删除,二叉搜索树的高度是变化的。例如,如果n nn个关键字按严格递增的次序被插入,则这棵树一定是高度为n − 1 n-1n−1的一条链。

遗憾的是,当一棵二叉搜索树同时由插入和删除操作生成时,我们对这棵树的平均高度了解的甚少。当树是由插入操作单独生成时,分析就会变得容易得多。因此,我们定义n nn个关键字的一棵随机构建二叉搜索树为按随机次序插入这些关键字到棵初始的空树中而生成的树,这里输入关键字的n ! n!n!个排列中的每个都是等可能地出现。则一棵有n nn个不同关键字的随机构建二叉搜索树的期望高度为O ( ln ⁡ n ) O(\ln n)O(lnn)。

#include
#include
#include<stdlib.h>
#include<time.h>
#include
#include
using namespace std;

#define random(x)(rand()%x)

typedef struct node* tree;

struct node
{
long int data;
node* left;
node* right;
};

int a[10] = {1,2,3,4,5,6,7,8,9,10};

tree BuildTree(tree root, int x)
{
if (!root)
{
root = new node;
root->data = a[x];
root->left = root->right = NULL;
}
else if (root->data > a[x])
{
root->left=BuildTree(root->left, x);
}
else
{
root->right=BuildTree(root->right, x);
}

return root;

}

tree RandomTree(tree root,int n)
{
srand((int)time(0));

while (n--)
{
	
	int q = random(10);
	if (a[q] == 0)
	{
		while (a[q] == 0)
		{
			q = random(10);
		}
	}
	root=BuildTree(root, q);
	a[q] = 0;
	
}

return root;

}

void preorder(tree root)
{
if (!root)
{
return;
}

cout << root->data << " ";

preorder(root->left);

preorder(root->right);

}

int main()
{

tree root = NULL;

root=RandomTree(root, 10);

preorder(root);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值