三個問題。 What/Why/How.
什麼是平衡樹? 平衡樹是 基於二叉搜索樹的 一種自動保持它的高度最小的一種樹。 通俗點說, 就是一個有着高度最小的二查搜索樹. [任意節點的子樹的高度差小於等於1 ]
爲什麼要有平衡樹? 請考慮一下兩個樹,對比來看。以下兩張圖都是二叉搜索樹, 但是很明顯能看出來當我們需要對其進行操作比如 插入刪除等,左邊的都會浪費更長時間。
我直接扒的Wiki的圖.. 見諒。
AVL tree | ||
---|---|---|
Type | Tree | |
Invented | 1962 | |
Invented by | Georgy Adelson-Velsky and Evgenii Landis | |
Time complexity in big O notation |
||
Average | Worst case | |
Space | O(n) | O(n) |
Search | O(log n)[1] | O(log n)[1] |
Insert | O(log n)[1] | O(log n)[1] |
Delete | O(log n)[1] | O(log n)[1] |
對於搜索,大家一眼就能看明白,一眼不行就倆眼一起, 但是對於insert 和 刪除, 我們要重點研究下,因爲操作之後可能會引起高度失衡需要從新對樹結構進行平衡。
如何進行平衡呢?
一共四種情況。
自己動手做了一遍之後發現也很簡單。 主要是先看看長的那一塊的節點是屬於哪種類型 左左或者 左右等, 然後再找準 root 和 pivot,迎刃而解。
Reference: https://www.cpp.edu/~ftang/courses/CS241/notes/self%20balance%20bst.htm
有問題歡迎指出。