LinkedBinaryTree
類的contains
方法。操做 | 說明 | LinkedList | BinarySearchTreeList |
---|---|---|---|
removeFirst | 刪除列表的第一個元素 | O(1) | O(logn) |
removeLast | 刪除列表的最後一個元素 | O(n) | (logn) |
remove | 刪除列表中的查找到的第一個元素 | O(n) | O(logn) |
first | 返回列表第一個元素 | O(1) | O(logn) |
last | 返回列表最後一個元素 | O(n) | O(logn) |
contains | 判斷列表是否含有一個特定元素 | O(n) | O(logn) |
is Empty | 斷定列表是否爲空 | O(1) | O(1) |
size | 列表中的元素數目 | O(1) | O(1) |
add(有序列表特有) | 向列表添加一個元素 | O(n) | O(logn) |
爲何樹須要平衡?html
若是二叉樹是一棵蛻化樹,他的效率可能比線性結構還要低。也就不能知足樹的高效實現。node
modCount
爲何是減減。modcount
應該是計算迭代次數的。modcount--
,這個未解決。AVLTreeNode
,換句話說,AVL樹和二叉查找樹以及鏈表實現的二叉樹之間的關係。首先,根據書上P240所述git
因爲須要上溯樹,所以AVL樹一般最好實現爲每一個結點都包含一個指向其父結點的引用。markdown
其次,根據書上P239所述數據結構
對於樹中的每一個結點,咱們都會跟蹤其左、右子樹的高度。架構
int
型變量height
,來得出結點的高度。AVLTreeNode
和LinkedAVLTree
的平衡方法後,我須要實現添加和刪除方法。可是,AVL樹和二叉查找樹惟一不一樣的是添加和刪除中若是不平衡要進行旋轉。 因此,AVL樹是能夠繼承二叉查找樹的。AVLTreeNode
所以確定也要繼承二叉樹指針類BinaryTreeNode
。可是,其實根本不用這麼麻煩呀!BinaryTreeNode
構建新的構造方法不就能夠了!public BinaryTreeNode(T obj, LinkedBinaryTree<T> left, LinkedBinaryTree<T> right,int height)`
存在的問題:
雖然準確理解了AVL樹中旋轉平衡的操做,可是並無總體理解代碼與代碼之間的關係。花費大量的時間作了無用功,同時讓本身陷入了錯誤的循環。
若是,我直接發現AVL樹是二叉查找樹的子類,那我也不會構建新的指針類。
因此,解決代碼問題,首先須要宏觀的觀察,肯定好總體的架構,這即是UML類圖的重要性。否則,儘管你細節處理的再完美,方向錯了,即是越走越遠。學習
先設計,考慮全部的狀況,再去實現。spa
根據書P238 給出右旋的操做.net
- 使樹根的左孩子元素成爲新的根元素。
- 使原根元素成爲這個新樹根的右孩子元素。
- 使原樹根的左孩子的右孩子,成爲原樹根的新的左孩子。
node
是原樹根,node1
是新樹根。node1 = node.left; node1.right = node; node.left = node1.right;
node.height = Math.max(height(node.left),height(node.right)); node1.height = Math.max(height(node1.left),height(node1.right)); return node1;
StackOverflowError
錯誤。node1 = node.left; node.left = node1.right; node1.right = node;
這樣的操做就會更加合理,一樣也不會出現死遞歸的錯誤。實現代碼以前,要考慮樹的子樹鏈接順序問題,和鏈表相似,不要出現丟失或者贅餘的狀況。設計
而後,我插入數字7。
如圖
這時,AVL樹對於根來講是平衡的,可是對於根的左子樹來講是不平衡的,由於根的左孩子沒有左孩子。對於較爲嚴格的AVL樹來講,這是不符合規則的。
因此,書上給出的避免操做是創建一個指向父結點的引用,經過上溯樹來判斷每一個結點是不是平衡的。
上週無錯題,優秀!
紅黑樹雖然難理解,可是應用的實例不少,也須要掌握。同時,AVL樹相對嚴格,實現代碼的時候要更加嚴謹,考慮所有的可能和狀況。從而儘量減小錯誤的出現。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 0/0 | 1/1 | 10/10 | |
第二週 | 610/610 | 1/2 | 20/30 | |
第三週 | 593/1230 | 1/3 | 18/48 | |
第四周 | 2011/3241 | 2/5 | 30/78 | |
第五週 | 956/4197 | 1/6 | 22/100 | |
第六週 | 2294/6491 | 2/8 | 20/120 | |
第七週 | 914/7405 | 1/9 | 20/140 |