說明:由於在日常提交列表中除錯過程以及碰到的問題不太明顯,所以將上機考試中的困難點列出輸入一行中綴表示式,轉換一顆二叉表示式樹,並求解.
【建立二叉表示式樹】
#建立字元棧op&&樹根棧tree
op.push('#')
#遍歷 str[i]
- if 是數字
依次存入樹根棧內
- if 是符號
判斷 str[i] 與 op棧頂的優先順序
if str[i] 低於 棧頂
t->data為op棧頂符號,右、左子樹為先後取tree棧頂元素
t入棧且op棧頂出棧
if str[i] 高於 棧頂
str[i]入棧
if str[i] 等於 棧頂
棧頂出棧
#棧頂元素不為』#『
同 str[i] 低於 棧頂優先順序
【計算表示式結果】
# if t不空
if 無左右子樹即葉子結點 //遞迴口
return t->data
else
x= evaluateextree(左子樹)
y=evaluateextree(右子樹)
判斷符號進行相應四則運算
「注意」 判斷分母為零時
說明:感覺pta習題提交列表沒有很準確,因為當時是在老師上完課之後就敲上去的,比較流暢,但是到了上機考試的時候還是 有很多小bug
二叉樹葉子結點的帶權路徑長度指:葉子結點的權重路徑長度。本題要求算出二叉樹所有葉子結點的帶權路徑長度和
【遞迴建樹】
create(i,str)
- i從0開始
- if i > 字串長度,即建樹完畢 || str[i]為』#『
return null //遞迴口
- else
t->data = str[i]
左子樹=create(2*i,str)
右子樹=creta(2*i+1,str)
return t
【計算帶權路徑長度和】
####形參為t和高度h以及引用wpl
- if 是空樹
return
- else
if 是葉節點
wpl+=h*(t->data-'0')
else
h++;
遞迴(左子樹,wpl,h);
遞迴(右子樹,wpl,h);
說明:層次遍歷樹中所有節點。輸出每層樹節點。
【遞迴法建樹】
略【層次遍歷】
void level(btree t)
# 新建佇列q
- level表示層數,flag作為判斷標誌——初始化為0
curnode作為前指標,last作為後指標——初始化為t
- if 空樹
輸出null,return
else
t入隊# 遍歷佇列 while(佇列不空)
- if curnode == lastnode //遍歷一層結束
level++
if flag==0 即第一層
cout<< 層數:
flag=1;
else
cout
- if 左或右子樹不空
左或右子樹進隊
- 隊首出隊
說明:給定二叉樹根結點 root ,此外樹的每個結點的值要麼是 0,要麼是 1,返回移除了所有不包含 1 的子樹的原二叉樹。( 節點 x 的子樹為 x 本身,以及所有 x 的後代。)
- 當我們需要修剪root時,我們需要先修剪root->left、root->right,然後再修剪root。這顯然是乙個遞迴定義,所以採用遞迴法處理。
- 先序遍歷會導致某些值為0的節點沒被刪掉,所以採用後序遍歷。
總結:看了一下力扣上有關樹的題集,大部分都是採用遞迴的演算法,**量非常少,看上去感覺特別簡單,這道題也是如此,但是遞迴我覺得算是乙個巧思,想到了就很簡單,沒有的話就還是很難的,而且閱讀**之後的感覺是解題不應該只是完成**,更關鍵的是簡化**,會用不同的方法去解題,遞迴演算法需要在更多的練習中去熟練運用。 DS部落格作業05 樹
通過這次對樹的學習,這是第一次學習非線性結構的資料結構,之前都是學線性的,感覺有點不習慣,做題之後 感覺線性和非線性的區別也就是遍歷的方法不一樣,以前線性結構遍歷都是用迴圈,到了非線性結構遍歷則都是 用遞迴。樹結構我覺得就分為兩種多叉樹和二叉樹,二叉樹結構體都是用左右孩子,而多叉樹結構體都是孩子和 ...
DS部落格作業05 樹
感覺樹的內容很難,一些邏輯比較難弄懂,而且內容比較多,所以還是得花時間去理解,樹不比先前的那些線性結構,多了很多新東西,比如帶權路徑長度,哈弗曼編碼什麼的,總之要學起來真的不容易。觀察表示式樹會發現數字字元的左孩子右孩子都是空的用於後面的表示式樹的運算 建立兩個棧乙個是樹節點的儲存型別乙個是字元儲存...
DS部落格作業05 樹
這一段時間學了樹 二叉樹 感覺樹的內容很難,內容比較難弄懂,所以還是得花時間去理解,總之要學起來真的不容易。在老師的課上跟著老師走對於樹概念和一些操作有了一定的理解 實際上理解透的卻沒有 自己下來實操 還是對於我來說有點難不會做。樹有二叉樹,哈夫曼樹等等的特殊結構的樹,遍歷的方式也是多種多樣 中序遍...