如果說平衡二叉樹是一個類的話,那么紅黑樹就是該類的一個實例。 算法的書我丟久了,一下子也找不到,我是憑記憶說的。紅黑樹的算法比較麻煩,但它的思想很好,如果理解了它的思想也就理解它的算法,我也只記得思想,具體算法記不得了。我就在這說說思想吧。 紅黑樹有兩個重要性質(zhì): 1、紅節(jié)點的孩子節(jié)點不能是紅節(jié)點; 2、從根到前端節(jié)點的任意一條路徑上的黑節(jié)點數(shù)目一樣多。 這兩條性質(zhì)確保該樹的高度為logN,所以是平衡樹。 紅黑樹是每個節(jié)點都帶顏色的樹,節(jié)點顏色或是紅色或是黑色,紅黑樹是一種查找樹。紅黑樹有一個重要的性質(zhì),從根節(jié)點到葉子節(jié)點的最長的路徑不多于最短的路徑的長度的兩倍。對于紅黑樹,插入,刪除,查找的復(fù)雜度都是O(log
N)。 插入的節(jié)點總是設(shè)為紅節(jié)點,當其復(fù)節(jié)點為紅節(jié)點時,這就有破壞了性質(zhì)1,就需要調(diào)整。將插入節(jié)點作為考察節(jié)點,考察其叔父,如果也是紅節(jié)點,則將其父親和叔父改為黑節(jié)點,而將其祖父改為紅節(jié)點,然后以其祖父為考察節(jié)點。如果其叔父是黑節(jié)點則做一旋轉(zhuǎn)變換可以搞定,沒有圖不太好說明,你可以自己考慮一下,總之它的思想是把“多出來”的紅色往上一層推去,確保下面層紅黑性質(zhì),最后推到根以后,如果依然違反性質(zhì)1,則可以直接把根由紅改黑即可,就相當于把這“多出來”的紅色推到樹以外的節(jié)點去了。 刪除節(jié)點時先要找到頂替的節(jié)點,如果刪去的節(jié)點是黑色則破壞了性質(zhì)2,也需要調(diào)整。調(diào)整的思想也同前面類似,把這個黑色賦予頂替節(jié)點,則頂替節(jié)點相當于有兩重黑色,然后將它的兩重黑色向上推,一直推到根,再從根推到外面去了。 平衡二叉樹的調(diào)整算法幾乎所有數(shù)據(jù)結(jié)構(gòu)的書都有呀,根據(jù)破壞平衡性的加入點,將插入操作分為了四種,分別是LL、LR、RR、RL。每種引起不平衡的插入位置,均有相應(yīng)的調(diào)整算法。 AVL樹又稱高度平衡的二叉搜索樹,是1962年由兩位俄羅斯的數(shù)學(xué)家G.M.Adel'son-Vel,sky和E.M.Landis提出 的.引入二叉樹的目的是為了提高二叉樹的搜索的效率,減少樹的平均搜索長度.為此,就必須每向二叉樹插入 一個結(jié)點時調(diào)整樹的結(jié)構(gòu),使得二叉樹搜索保持平衡,從而可能降低樹的高度,減少的平均樹的搜索長度. AVL樹的定義: 一棵AVL樹滿足以下的條件: 1>它的左子樹和右子樹都是AVL樹 2>左子樹和右子樹的高度差不能超過1 從條件1可能看出是個遞歸定義,如GNU一樣. 性質(zhì): 1>一棵n個結(jié)點的AVL樹的其高度保持在0(log2(n)),不會超過3/2log2(n+1) 2>一棵n個結(jié)點的AVL樹的平均搜索長度保持在0(log2(n)). 3>一棵n個結(jié)點的AVL樹刪除一個結(jié)點做平衡化旋轉(zhuǎn)所需要的時間為0(log2(n)). AVL
樹是高度平衡的,頻繁的插入和刪除,會引起頻繁的reblance,導(dǎo)致效率下降 |
|