11.1 概述:html
操做 | 說明 |
---|---|
addElement | 往樹中添加一個元素 |
removeElement | 從樹中刪除一個元素 |
removeAllOccurrences | 從樹中刪除所指定元素的任何存在 |
removeMin | 刪除樹中的最小元素 |
removeMax | 刪除樹中的最大元素 |
findMin | 返回一個指向樹中最小元素的引用 |
findMax | 返回一個指向樹中最大元素的引用 |
11.2 用鏈表實現二叉查找樹 前端
11.2.1 addElement操做:git
若右孩子爲空,新元素成爲根的右孩子;若右孩子不爲空,則遍歷根的右孩子,再次進行比較操做。數組
11.2.2 removeElement操做:
數據結構
3.若被刪除的結點有兩個孩子,則replacement返回中序遍歷中的後繼者。學習
11.2.3 removeAllOccurrences操做:.net
反覆調用removeElement方法來刪除某一指定元素的全部存在。設計
11.2.4 removeMin操做:
3d
3.若樹的最左側結點是一個內部結點,則須要設置其父結點的左孩子引用指向這個將刪除結點的右孩子。調試
11.3 用有序列表實現二叉查找樹
操做 | 描述 |
---|---|
removeFirst | 從列表中刪除第一個元素 |
removeLast | 從列表中刪除最後一個元素 |
remove | 從列表中刪除某個元素 |
first | 查看位於列表前端的元素 |
last | 查看位於列表末端的元素 |
contains | 肯定列表是否含有某一個元素 |
isEmpty | 斷定列表是否爲空 |
size | 肯定列表中的元素數量 |
操做 | 描述 |
---|---|
add | 向列表中添加一個元素 |
11.3.1 BinarySearchTree實現的分析:
操做 | LinkedList | BinarySearchTreeList |
---|---|---|
removeFirst | O(1) | O(log n) |
removeLast | O(n) | O(log n) |
remove | O(n) | O(log n)* |
first | O(1) | O(log n) |
last | O(n) | O(log n) |
contains | O(n) | O(log n) |
isEmpty | O(1) | O(1) |
size | O(1) | O(1) |
add | O(n) | O(log n) * |
add操做和remove操做均可能致使樹變得不平衡 |
其看起來更像是一個鏈表,然而其效率卻比鏈表還低,其附帶了額外的開銷。
若無平衡假設,則最壞狀況下addElement操做的時間複雜度爲O(n)而不是O(log n),樹根是最小元素,而即將被插入的元素可能成爲樹中的最大元素。
左孩子繞着其父結點向右旋轉;
旋轉前,x是p的左兒子。x的右兒子(若存在)變爲p的左兒子,p變爲x的右兒子。
旋轉前,x是p的右兒子。x的左兒子(若存在)變爲p的右兒子,p變爲x的左兒子。
11.4.3 右左旋(rightleft rotation):
11.4.3 左右旋(leftright rotation):
11.5 實現二叉查找樹:AVL樹
3.每一個節點都有一個平衡因子(balance factor),任一節點的平衡因子是-1,0,1。(每一個節點的平衡因子等於右子樹的高度減去左子樹的高度 )
11.6 實現二叉查找樹:紅黑樹
問題1:如何刪除某一指定結點的子樹。
解決:
錯題1:
錯題2:
錯題3:
錯題4:
解決:二分查找利用的是查找池已排序這一事實。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | |
---|---|---|---|
目標 | 3000行 | 15篇 | 300小時 |
第一週 | 0/0 | 1/1 | 12/12 |
第二週 | 935/935 | 1/2 | 24/36 |
第三週 | 849/1784 | 1/3 | 34/70 |
第四周 | 3600/5384 | 1/5 | 50/120 |
第五週 | 2254/7638 | 1/7 | 50/170 |
第六週 | 2809/10447 | 1/9 | 45/215 |
第七週 | 3700/14147 | 1/10 | 40/255 |