思想:
当我们把一个新节点插入的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; }
随机化插入的缺点:
- 每次插入期间每个节点生产随机数的开销。
- 每个节点需要有一个域用于记录该节点子树节点个数。