DS部落格作業05 樹

2022-04-12 21:06:18 字數 2237 閱讀 9381

通過這次對樹的學習,這是第一次學習非線性結構的資料結構,之前都是學線性的,感覺有點不習慣,做題之後

感覺線性和非線性的區別也就是遍歷的方法不一樣,以前線性結構遍歷都是用迴圈,到了非線性結構遍歷則都是

用遞迴。樹結構我覺得就分為兩種多叉樹和二叉樹,二叉樹結構體都是用左右孩子,而多叉樹結構體都是孩子和

兄弟,二叉樹有三種遍歷方式,先序遍歷、中序遍歷、後序遍歷,通過這三種遍歷來解決二叉樹的問題。

定義乙個全域性變數wpl存放葉子帶權長度和

輸入str字串;

根據字串建立乙個根為bt的樹;

遞迴先序遍歷樹bt

if(左右節點都為空) //為葉子

wpl += h* (b->data-'0') //h為當前節點的高度

q1:部分錯誤,字串的結束標誌判斷錯誤

a1:在建樹函式中剛開始第乙個if中寫的是i>maxsize才返回空,正確應該是i>=maxsize

q2:樹的高度初始化錯誤

a2:剛開始樹的高度初始化為1,結果得不到正確的答案,初始高度設為零就正確了

輸入字串str

根據str建立根為bt的二叉樹

levelorder函式層次便利二叉樹

if(根節點不為空) 將根節點入隊

while(佇列不為空)

q1:兩次錯誤都是因為格式問題,沒有控制好什麼時候輸出回車和層數

a1:最後才發現輸出回車的規律,新建乙個節點q,剛開始讓q等於根節點,當每次出隊的節點等於q時就要輸出回車

並且輸出回車時要讓q等於現在的隊尾節點

遞迴後序遍歷二叉樹

if(節點為空) return 0;

lefthigh=getheight(bt->left); //lefthigh為左子樹的高度

righthigh=getheight(bt->right); //righthigh為右子樹的高度

比較lefthigh和righthigh大小

較大的數加一併作為返回值

這個演算法從數的最底層開始算數的高度,最底層為0然後一級一級向上返回,每次返回的時候數值都加一

q1:多次編譯錯誤

a1:這些編譯錯誤都是因為在編譯器寫**的時候沒有用題目給的結構體,定義的左右孩子名稱不一樣,

雖然自己在編譯器上可以執行,提交上去就是編譯錯誤

同樣用到的是用到層次遍歷的問題,不過這邊沒用到佇列而是用到了vector這一c++中的容器,不過用法是跟佇列相同的

迴圈的順序從佇列不為空到vector不為空,每次將最有邊的結點存入乙個vector陣列中,最後vector陣列作為返回值並輸出

學習到了vector的使用。從此**中知道,在層次遍歷二叉樹的過程中,不僅可以用佇列,還可以用vector陣列,也多了解了c++stl容器中的乙個類,

感覺vector可能比棧和佇列用的更廣泛,而且vector可以解決陣列浪費空間這一問題。

DS部落格作業05 樹

說明 由於在日常提交列表中除錯過程以及碰到的問題不太明顯,所以將上機考試中的困難點列出輸入一行中綴表示式,轉換一顆二叉表示式樹,並求解.建立二叉表示式樹 建立字元棧op 樹根棧tree op.push 遍歷 str i if 是數字 依次存入樹根棧內 if 是符號 判斷 str i 與 op棧頂的優...

DS部落格作業05 樹

感覺樹的內容很難,一些邏輯比較難弄懂,而且內容比較多,所以還是得花時間去理解,樹不比先前的那些線性結構,多了很多新東西,比如帶權路徑長度,哈弗曼編碼什麼的,總之要學起來真的不容易。觀察表示式樹會發現數字字元的左孩子右孩子都是空的用於後面的表示式樹的運算 建立兩個棧乙個是樹節點的儲存型別乙個是字元儲存...

DS部落格作業05 樹

這一段時間學了樹 二叉樹 感覺樹的內容很難,內容比較難弄懂,所以還是得花時間去理解,總之要學起來真的不容易。在老師的課上跟著老師走對於樹概念和一些操作有了一定的理解 實際上理解透的卻沒有 自己下來實操 還是對於我來說有點難不會做。樹有二叉樹,哈夫曼樹等等的特殊結構的樹,遍歷的方式也是多種多樣 中序遍...