了解avltree樹之前先了解幾個概念 //
1)什么是二分搜索樹;
2)什么是平衡樹;
3)什么自平衡二分搜索樹;
1)二分搜索樹以及缺陷 //
如上圖,是一顆二分搜索樹,從添加查找節(jié)點,時間復雜度均為O(h),但在極端情況下,
如按順序向一個空二分搜索樹中添加0,1,2,3,4,二分搜索數會退化為單鏈,這時候時間
時間復雜度會變成O(n),如下圖,為了避免這種情況需要結合平衡樹做改進, //
2)平衡樹 //
3)如果一顆二分搜索樹按照平衡樹的形式分布,可以避免搜索樹退化為單鏈,
時間復雜度將一直是O(logN),由此有了自平衡二叉樹。
平衡二叉樹有以下特點://
1. 左右兩顆子樹的高度差不超過1;
2. 左右兩顆子樹也是一顆平衡二叉樹;
3. 能夠在二叉樹不滿足平衡二叉樹的條件下自動轉化為平衡二叉樹
AVL樹是自平衡樹的一種,也是最早的自平衡二分搜索樹,在1962年首次提出 //
問1:什么時候維護平衡?
答1:只有在插入或者刪除節(jié)點中,才有可能導致節(jié)點不平衡,在這兩個過程中維護平衡
問2:如何維護平衡?
答2:AVL樹通過左旋轉,右旋轉的方式來維護平衡,具體分以下4種情況:
1. 插入或刪除的節(jié)點在不平衡節(jié)點左側的左側 LL --> 右旋轉;
2. 插入或刪除的節(jié)點在不平衡節(jié)點左側的右側 LR --> 左節(jié)點先左旋轉,之后不平衡節(jié)點右旋轉;
3. 插入或刪除的節(jié)點在不平衡節(jié)點右側的右側 RR --> 左旋轉;
4. 插入或刪除的節(jié)點在不平衡節(jié)點右側的左側 RL --> 右節(jié)點先右旋轉,之后不平衡節(jié)點左旋轉;
如下面,圖演示過程:
具體實現和測試接另一篇
(22)Go實現AVL樹-實現和測試
http://www.lxweimin.com/p/c51a087278fb
有bug歡迎指出