1.樹是非線性結構,其元素組織爲一個層次結構
html
9.使用決策樹能夠設計專家系統java
在二叉查找樹中:git
若任意節點的左子樹不空,則左子樹上全部結點的值均小於它的根結點的值; 任意節點的右子樹不空,則右子樹上全部結點的值均大於它的根結點的值; 葉節點的左、右子樹也分別爲二叉查找樹。 沒有鍵值相等的節點。
與次優二叉樹相對,二叉排序樹是一種動態樹表。其特色是:樹的結構一般不是一次生成的,而是在查找過程當中,當樹中不存在關鍵字等於給定值的結點時再進行插入。新插入的結點必定是一個新添加的葉子結點,而且是查找不成功時查找路徑上訪問的最後一個結點的左孩子或右孩子結點。算法
1.首先執行查找算法,找出被插結點的父親結點。數組
判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。服務器
若二叉樹爲空。則首先單獨生成根結點。首先執行查找算法,找出被插結點的父親結點。數據結構
判斷被插結點是其父親結點的左、右兒子。將被插結點做爲葉子結點插入。學習
若二叉樹爲空。則首先單獨生成根結點。測試
2.執行刪除結點算法設計
在二叉排序樹刪去一個結點,分三種狀況討論:
1.若結點爲葉子結點,即左子樹和右子樹均爲空樹。因爲刪去葉子結點不破壞整棵樹的結構,則能夠直接刪除此子結點。
2.若結點只有左子樹或右子樹,此時只要令或直接成爲其雙親結點的左子樹或右子樹便可,做此修改也不破壞二叉排序樹的特性。
3.若結點的左子樹和右子樹均不空。在刪去結點以後,爲保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,能夠令結點的直接前驅(或直接後繼)替代該結點,而後再從二叉排序樹中刪去它的直接前驅(或直接後繼)即讓結點的左子樹(若是有的話)成爲結點左子樹的最左下結點(若是有的話),再讓左子樹成爲結點的左右結點的父結點。
4.右旋轉
若是由根的左子結點的左子樹上的長路徑而帶來的不平衡性。將執行步驟: 令根的左子結點變爲新的根。 令原根結點變爲新的根結點的右子結點。 令原根的左子結點的右子結點變爲原根的結點的新的左子結點。
5.左旋轉
若是由根的右子結點的右子樹上的長路徑而帶來的不平衡性。將執行步驟: 令根的右子結點變爲新的根。 令原根結點變爲新的根結點的左子結點。 令原根的右子結點的左子結點變爲原根的結點的新的右子結點。
6.右-左旋轉
7.左-右旋轉
若是不平衡性是由根的左子結點的右子樹中的長路徑引起的,則必須先繞那個異常子樹執行一次左旋轉,而後再繞跟執行一次右旋轉。
問題1解決方案:
一、先序遍歷——先訪問根,再自左向右遍歷子樹
二、中序遍歷——遍歷左子樹,而後訪問根,而後自左向右遍歷餘下的各個子樹
三、後續遍歷——自左向右遍歷各個子樹,而後訪問根
四、層序遍歷——從樹的頂層(根)打包底層,從左至右,訪問樹中每層的每一個結點
問題2解決方案:
滿二叉樹——除了葉結點外每個結點都有左右子葉且葉子結點都處在最底層的二叉樹。
徹底二叉樹——若設二叉樹的高度爲h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層有葉子結點,而且葉子結點都是從左到右依次排布,這就是徹底二叉樹。
滿二叉樹必定是徹底二叉樹,徹底二叉樹不必定是滿二叉樹。
問題3解決方案:首先咱們須要瞭解二叉樹中元素是如何放置的。咱們定義一個根的元素,而後把新加進來的元素和根比較(以第二個加進來的元素爲10,根爲20舉例)。10<20,因此咱們將10放在根的左結點,因爲根的左子樹目前只有一個元素因此咱們將10設置爲根的左子樹的根。若是第三個元素是11,那麼咱們首先和根比較,小於20,那麼咱們將11往下放,與10比較,比10大,那麼咱們放在10的右結點上。(若是添加的元素比20小也比10小那麼放在10的左結點)以此類推。右子樹也是同樣的道理。總的來講,二叉樹的元素放置是以根爲基準,比根大的放右子樹,比根小的放左子樹。若是同樣的話左右子樹任君挑選。
問題4解決方案:若是二叉查找樹是平衡的,每次比較時都會排除差很少一半的元素。樹越不平衡,它離線性結構越近,效率也就越低。
1.
解析:對隊列的操做沒有記清,這道題全部的操做都是隊列的操做。
2.
解析:若是在空堆棧上調用pop方法,則拋出EmptyCollectionException。
3.
單詞:self-referential(自引用對象)
4.
5.
單詞:insertion (插入)
本週主要學習了樹和二叉查找樹。學到了許多重要的知識,例如四種遍歷、三種表達式、關於樹的問題的一些計算、二叉查找樹的平衡因子等等,收穫頗多。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 10000行 | 30篇 | 400小時 | |
第一週 | 56/56 | 2/2 | 20/20 | 主要學會了簡單的操做Linux以及如何編寫簡單的java程序並將它上傳到碼雲 |
第2、三週 | 331/407 | 3/5 | 23/43 | 學會了一些類和程序包的使用,也明白了C語言和Java在有些地方的區別 |
第四周 | 595/1002 | 2/7 | 20/60 | 學會了IDEA以及用IDEAgit碼雲,也學會了TDD測試 |
第五週 | 1621/2623 | 2/9 | 17/77 | 見識了服務器與用戶連接的代碼,也學習了繼承的一些知識。 |
第六週 | 1770/4393 | 1/10 | 22/99 | 學習了多態以及與接口和繼承的關係,還有就是對異常的學習和處理異常的方法以及自定義一個異常 |
第七週 | 1747/6140 | 3/13 | 23/122 | 學習了漸進複雜度的計算,棧和隊列的學習,分別用數組和鏈表實現隊列 |
第八週 | 384/6524 | 1/14 | 20/142 | 學習了一些查找和排序的算法,也學會了計算ASL |
第九周 | 1895/8419 | 3/17 | 22/164 | 學習了樹的四種遍歷,和怎樣根據已知序列求未知序列等等 |
計劃學習時間:20小時
實際學習時間:22小時
改進狀況:無