1. 程式人生 > >算法筆記:平衡二叉樹(AVL)最小結點數與斐波那契數列的關系

算法筆記:平衡二叉樹(AVL)最小結點數與斐波那契數列的關系

註意 混淆 ron 很大的 鍛煉 字母 但是 它的 平衡二叉樹

寫點思考性質的文字,最好還是不要太突兀,背景前提什麽的還是需要有的……

平衡二叉樹是什麽?

我自己的理解:
二叉樹裏面的完全二叉樹就是一種很平衡的樹,即按照1-23-4567-89101112131415-……這麽一行行分叉下去的數。所以在二叉樹的定義裏,就有了這樣的描述:
一個空樹(根本沒有結點的);或者任意結點,它的左右子樹的高度差不大於1(我覺得這裏用完全二叉樹來輔助記憶挺不錯)。

但是要註意一點;
只要滿足任意一個結點的左右兩子樹的高度不大於1就可以是平衡二叉樹。而剛才說的完全二叉樹,是滿足這一條件的“最完全”狀態,所以自然也就存在去掉中間某些結點後還是平衡二叉樹的“不完全”狀態。

由此引出平衡二叉樹最小結點數

的問題。

如何來理解最小結點數?

開始前的說明

關於高度,初學者容易和深度混淆,深度是從根結點開始的,而高度是從任意結點到葉子結點的。所以這裏所說的左右子樹的高度差可以這麽來理解:

一個結點沒有子樹了,那麽高度就是0(0 - 0 = 0),有一個子結點就為1(1 - 0 = 0)

這樣再來理解左右子樹的高度差,
假設一棵樹有3層,那麽把第一層作為一個結點,第二第三層的結點構成這個結點的左右子樹,這個3層數的高度也就是2(0、1、2),那麽第一層結點的左右子樹的高度也就為1,1或者0,1。

用字母表示,這棵樹的高度h,第一層結點的左右子樹的高度,在結點數最少時,要滿足一個是h - 1、另一個是h - 2;用nh來表示對應h的結點數,那麽這裏:n(h-1) = 1, n(h-2) = 0, n(h) = 1 + 0 + 1 = 2。

推廣出這個公式:n(h) = n(h-1) + n(h-2) + 1,這個1是兩棵左右子樹所上接的結點。

與斐波那契數列什麽關系呢?

斐波那契數列的第1、第2項都為1,然後後面的每一項都是前兩項之和;
而平衡二叉樹的最小結點數,第1項為1,第2項(h = 1)為2,且後面的每一項是前兩項之和再加1。具體寫一下:

Fh 1 1 2 3 5 8 13 21 34
nh 1 2 4 7 12 20 33

可以觀察到nh = F(h+2) - 1然後再往下多分析一步:
找出兩者之間的關系,其實就是為了大致計算出h與n的關系。
Fh的近似值:0.4472135955 * 1.618033988745^h


所以,最終想要得到的近似關系是,兩邊同取lg,計算出h與n的關系。

最後一點

其實這樣的計算是很不嚴謹的,因為偏差還是很大的。不過能夠理解最小結點數是怎麽來的(怎麽遞推出來的),倒是一種很好的思維邏輯鍛煉。

PS. 最小結點數和對應的高度意味著,比如h = 4,那麽結點數12~19範圍內都是h = 4的樹。

算法筆記:平衡二叉樹(AVL)最小結點數與斐波那契數列的關系