第五章我們學習了新的資料結構,也就是樹。相比較與之前學的內容,我覺得樹更加的複雜。
在學習二叉樹的遍歷的過程中,在樹的操作過程中很多重複操作都是要通過遞迴實現的,我對遞迴的思想也更加深刻明了。
我們也學習了許多二叉樹的性質,比如:
二叉樹的性質:
1:二叉樹的第i層上至多有2^(i-1)個結點
2:深度為k的二叉樹,至多有2^k-1個結點
完全二叉樹的性質:
1:結點 i 的子結點為2*i 和 2*i+1(前提是都小於總結點數)
2:結點 i 的父結點為 i/2
還學習了遍歷二叉樹的3中方法:
1:先序遍歷:根->左子樹->右子樹
2:中序遍歷:左子樹->根->右子樹
3:後序遍歷:左子樹->右子樹->根
二叉樹的儲存結構有:鏈式結構(採用鍊錶法),順序結構(採用陣列),個人使用感覺順序結構更加的方便
也學習了霍夫曼樹的構建與計算:
(1)將各個節點按照權重從小到大排序;
(2)取最小權重的兩個節點,並新建乙個父節點作為這兩個節點的雙親,雙親節點的權重為子節點權重之和,再將此父節點放入原來的佇列;
(3)重複(2)的步驟,直到佇列中只有乙個節點,此節點為根節點;
在小組合作中,我們組一開始的**如下:
#includeusingnamespace
std;
typedef
struct node;
typedef
struct *tree, tree;
void creattree(tree& t, int n)//
構建樹;
for (int i = 1; i <= n; i++)
}for (int i = 1; i <= n; i++)//
遍歷查詢根結點
if (b[i] == 0
)
}void searchleaf(tree t, int n)//
查詢最深的結點
if (k == n - 1)//
判斷k是否到達結點深度最大值
else
if (k >m)
}k = 0
; }
cout
<}int
main()
有以下問題:
1.最後乙個測試點會出現時間超時
2.演算法是由葉子結點向上查詢根節點,比較深度,時間複雜度太大
3.沒有釋放空間
因為演算法出了問題,導致整個**都無法過關,後來嘗試了許多改進比如構造乙個陣列記錄葉子結點,也無法過最後乙個測試點。葉子結點向上查詢根節點的演算法在查詢葉子深度的方面時間複雜度是o(n^2),而層次遍歷是o(n)。
以後小組展開工作前應吸取這次的教訓,仔細討論出方法的時間複雜度再開工,以免出現這種問題。
第五章學習小結
1 第五章主要學習了與樹相關的知識,從二叉樹拓展到一棵普通的樹,再從一棵普通的樹拓展到哈夫曼樹,再從樹拓展到森林的概念。5 1節學習了樹和二叉樹的定義,對節點,根節點,葉子結點,深度,度等概念進行了初步的了解。5 4節了解了與二叉樹相關的一些性質,其中引出了完全二叉樹與滿二叉樹的概念,從這一節開始也...
第五章學習小結
一 小結 1.二叉樹 定義與性質 1 二叉樹有五種基本形態 2 在二叉樹的 第 i 層上至多有 2 i l 個結點 i 1 3 深度為 k 的 二叉樹至多有 2 k 1 個結點 k 1 4 葉子結點數 度為2結點數 1 5 滿二叉樹是完全二叉樹的一種 還有更常見的非完全二叉樹 二叉樹的儲存與遍歷 1...
第五章學習小結
第五章 樹和二叉樹中我學到的 一,基本定義 樹 二叉樹 完美二叉樹 偏二叉樹,節點關係,樹的深度,葉節點等等的定義 二,樹 二叉樹 的基本儲存結構 1 用陣列,適用於滿二叉樹 2 鏈式結構 3 陣列加鍊表式 雙親孩子表示法 如下 tyepdef struct cnodecnode tyepdef s...