思想:
當我們把一個新節點插入的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;
}
隨機化插入的缺點:
- 每次插入期間每個節點生產隨機數的開銷。
- 每個節點需要有一個域用於記錄該節點子樹節點個數。