思想:
当我们把一个新节点插入的N个节点的树中时,新节点出现在树根的概率是1/(N+1),因而我们就随机决定用这个概率进行根插入。否则,我们递归的使用下述方法插入新纪录:如果该记录的关键字小于树根的关键字,就把记录插入到左子树中;如果该记录的关键字小于树根的关键字,就把该记录插入到右子树中。
程序实现:
link insertR(link h,Item item)//item 插入树 h
{
Key v = key(item);
Key t = key(h->item);
if(h == z) //空树
return NEW(item,z,z,l);
if(rand() < RAND_MAX/(h->N+1)) //随机决定是否采用根插入法(rand()产生随机数),这样新纪录的最终位置可能记录在路径中任何地方。
return insertT(h,item);
if less(v,t) //否则,递归的用下述方法插入新记录
h->l = insertR(h->l,item);
else
h->r = insertR(h->r,item);
(h->N)++;
return h;
}
随机化插入的缺点:
- 每次插入期间每个节点生产随机数的开销。
- 每个节点需要有一个域用于记录该节点子树节点个数。