我们已经证明了二叉搜索树上的每个基本操作都能在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);
}