1.二叉查找樹是一種帶有附加屬性的二叉樹,即對樹的每一個結點都有左結點小於父結點,右結點小於或等於父結點。html
2.二叉查找樹的定義是二叉樹定義的擴展。前端
方法 | 描述 |
---|---|
addElement | 往樹中添加一個元素 |
removeElement | 從樹中刪除一個元素 |
removeAllOccurrences | 從樹中刪除所指定元素的任何存在 |
removeMin | 刪除樹中最小的元素 |
removeMax | 刪除樹中最大的元素 |
findMin | 返回一個指向樹中最小元素的引用 |
findMax | 返回一個指向樹中最小元素的引用 |
1.每一個BinaryTreeNode對象要維護一個指向結點所儲存元素的引用,另外還要維護指向結點的每一個孩子的引用。node
1.用BinarySearchTreeList類實現ListADT接口和OrderedListADT接口。git
操做 | 說明 |
---|---|
add | 向列表添加一個元素 |
removeFirst | 刪除列表的首元素 |
removeLast | 刪除列表的末元素 |
remove | 刪除列表中一個特定元素 |
first | 考察列表前端那個元素 |
last | 考察列表末端那個元素 |
contains | 斷定列表是否含有一個特定元素 |
is Empty | 斷定列表是否爲空 |
size | 斷定列表中的元素數目 |
3.樹的主要使用之一就是爲其餘集合提供高效的實現。算法
4.BinarySearchTreeList實現的分析:數組
操做 | 說明 | LinkedList | BinarySearchTreeList |
---|---|---|---|
add | 向列表添加一個元素 | O(n) | O(log n)* |
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操做和remove操做均可能致使樹變得不平衡。數據結構
1.若是二叉查找樹不平衡,其效率可能比線性結構還要低。ide
2.維護樹的平衡有着多種算法,有些蠻力方法(中序遍歷,把數組的中間元素做爲樹根,再構造出左平衡子樹和右平衡子樹。),有些方案更優美(AVL樹和紅黑樹)。函數
3.右旋: 在最小平衡子樹根節點平衡因子>=2且在根節點的左孩子的左孩子插入元素,進行右旋性能
使樹根的左孩子元素成爲新的根元素。
使原根元素成爲這個新樹根的右孩子元素。
使原樹根的左孩子的右孩子,成爲原樹根的新的左孩子。
4.左旋: 在最小平衡子樹根節點平衡因子>=-2且在根節點的右孩子的右孩子插入元素,進行左旋。
使樹根的右孩子元素成爲新的根元素。
使原根元素成爲這個新樹根的左孩子元素。
使原樹根的右孩子的左孩子,成爲原樹根的新的右孩子。
5.右左旋:最小平衡子樹根節點(80)的右孩子(100)的左孩子(90)的子節點(95)插入新元素,先繞根節點的右孩子節點(100)右旋,再圍根節點(80)左旋
6.左右旋:在最小平衡子樹根節點(80)的左孩子(50)的右孩子(70)的子節點插入新元素,先繞根節點的左孩子節點(50)右旋,再圍根節點(80)左旋
1.右子樹的高度減去左子樹的高度稱爲該結點的平衡因子。
2.樹(或樹的任何子樹)只有兩種途徑能變得不平衡:插入結點或刪除結點。
3.由於須要上溯樹,因此AVL樹一般最好實現爲每一個結點都包含一個指向其父結點的引用。
4.AVL樹的插入操做首先會按照普通搜索二叉樹的插入操做進行,當插入一個數據後,咱們會沿着插入數據時所通過的的節點回溯,回溯的過程當中會判回溯路徑中的每一個節點的左子支高度與右子支高度之差的絕對值是否超過1,若是超過1咱們就進行調整,調整的目的是使得該節點知足AVL樹平衡的定義。
問題1:本身看了一下紅黑樹,不是很理解,上網查了一下
問題1解決方案:紅黑樹和以前所講的AVL樹相似,都是在進行插入和刪除操做時經過特定操做保持二叉查找樹的平衡,從而得到較高的查找性能。自從紅黑樹出來後,AVL樹就被放到了博物館裏,聽說是紅黑樹有更好的效率,更高的統計性能。不過在我瞭解了紅黑樹的實現原理後,並不相信這是真的,關於這一點咱們會在後面進行討論。
紅黑樹和AVL樹的區別在於它使用顏色來標識結點的高度,它所追求的是局部平衡而不是AVL樹中的很是嚴格的平衡。以前咱們在講解AVL樹時,已經領教過AVL樹的複雜,但AVL樹的複雜比起紅黑樹來講簡直是小巫見大巫。紅黑樹是真正的變態級數據結構。
問題1:在無返回值的條件下語句有return的做用?
問題1解決方法:return的使用一直在存在返回值條件下使用,可是從未在無返回值條件下使用。若是return後面不接內容的話,就會結束該方法並不會輸出任何內容的。
(1.)return語句:是指結束該方法,繼續執行方法後的語句。
(2.)break語句:是指在循環中直接退出循環語句(for,while,do-while,foreach),break以後的循環體裏面的語句也執行。
(3.)continue語句:是指在循環中中斷該次循環語句(for,while,do-while,foreach),本次循環體中的continue以後語句不執行,直接跳到下次循環。
問題2:在方法中,我將要進行操做的結點做爲形參放入方法中(以 node T爲例),而後對T.left進行操做,可是我返回到主程序後,發現主函數的樹並無發生變化。
問題2解決辦法:
第一步:經過調試我發如今方法裏,樹的確變化了,證實錯誤不在個人代碼思路上。
第二步:通過個人實驗發現,若直接對結點T進行操做,主程序裏的樹是能夠變化的。所以,我意識到只有對形參自己進行操做,纔會將操做保存到主程序中,若用形參去調用其餘方法,這個變化不會保存。
1.Which of the following methods removes an element from a queue?
A . enqueue
B . dequeue
C . first
D . pop
E . push
解析:dequeue方法從隊列中刪除元素
2.In an ideal implementations of a stack and a queue, all operations are ______________________ .
A . O(1)
B . O(n)
C . O(n log n)
D . O(n2)
E . it depends on the operation
解析:
在堆棧和隊列的良好實現中,全部操做都須要固定的時間。
3.It is possible to implement a stack and a queue in such a way that all operations take a constant amount of time.
A . true
B . false
解析:堆棧和隊列的理想實現要求全部操做都須要恆定的時間量。
點評過的同窗博客和代碼
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 109/109 | 2/2 | 20/20 | |
第2、三週 | 729/838 | 2/4 | 47/67 | |
第四周 | 750/1588 | 2/6 | 22/89 | |
第五週 | 1588/2698 | 2/7 | 34/133 | |
第六週 | 1350/4035 | 2/9 | 24/157 | |
第九周 | 3364/7399 | 5/14 | 97/254 | |
第十週 | 618 /8071 | 1/15 | 22/276 | |
第十一週 | 772/8843 | 3/18 | 16/292 |