我有一個鏈接列表/二叉樹方法的庫,當標準容器不適合時使用 - 例如當有不同類型的節點時,或者當我需要從二叉樹轉換爲列表並返回時。它包括紅黑樹處理。當轉換爲紅黑樹時,是否有理由選擇一種形式而不是另一種形式?
其中一種方法在O(n)
時間(假設項目數已知)中從雙鏈錶轉換爲完全平衡的簡單二叉樹。該算法被稱爲「摺疊」 - 這是一次在Dr. Dobbs'中發佈的二叉樹重新平衡算法的後半部分。這些步驟基本上都是......
由於樹的大小,決定對左,右子樹
遞歸左子樹
的尺寸從彈出的節點該列表以root
遞歸的右子樹
鏈接的使用ubtrees的根
我也有類似的方法,創建一個紅黑樹。原理是一樣的,但遞歸跟蹤節點高度 - 高度爲零的節點被創建爲紅色,其他所有節點都是黑色的。起始高度計算基於樹大小中的最高設置位,並且被弄亂,使得尺寸完美的(2^n)-1
大小的樹僅具有黑色節點(遞歸僅下降到高度1)。
這裏的要點是,我只在葉級別有紅色節點,最多隻有一半的節點是紅色的。
事情是,雖然這是生成有效的紅黑樹的簡單方法,但它不是唯一的選擇。避免讓一片完美平衡的樹上的所有葉子變成紅色是一種任意的選擇。我可以有紅色和黑色節點的交替層。或者,在某些情況下,我可以通過發現完美平衡的子樹(如果它需要紅色節點),使子樹根變紅而不是所有樹葉,顯着減少紅色節點的數量。
問題是 - 是否有任何實際的理由選擇一個有效的紅黑樹形式而不是另一個?
這是純粹的好奇心 - 我知道我沒有任何實際的理由 - 但有誰知道這個選擇是重要的專家應用程序?
對不起這段時間刪除接受,但我真的很喜歡jbapple的新答案 – Steve314 2017-01-23 15:21:28