部落格作業04 樹

2022-06-01 05:33:08 字數 2502 閱讀 4701

層次遍歷:

void level(btree bt)

else 輸出首節點的data(前面帶空格)

若首節點左子樹不為空,則入隊

i若首節點右子樹不為空,則入隊

樹為空的時候沒有輸出null導致部分正確

計算帶權路徑長度和函式:

static int l=0;//l為帶權路徑和

int wpl(btree bt)

如果是左子樹 wpl(bt->lchild);

如果是右字數 wpl(bt->rchild);

在devec除錯了多次輸出結果不對,結果很大,發現

這邊寫錯了,乙個是用的字元型輸入,需要對數字進行處理,還有就是路徑是h-1不是h

建樹:

建立乙個存放符號的棧op,和存放根結點的棧root

往符號棧op中存入#

while(字串未遍歷完)

如果是數字

定義乙個根節點並初始化並且值為這個數字

將這個根節點入根節點棧root

否則while(op棧的棧頂優先順序大於此時遍歷的符號)

定義乙個根節點並初始化並且值為op棧頂元素

op棧頂元素出棧

root棧出棧兩個元素作為剛定義的根節點的左右孩子

入棧這個根節點

如果(op棧的棧頂優先順序小於此時遍歷的符號)

將這個符號入棧到op棧

否則op棧出棧

while(棧頂元素不為#即還有需要建立的結點)

定義乙個根節點並初始化並且值為op棧頂元素

op棧頂元素出棧

root棧出棧兩個元素作為剛定義的根節點的左右孩子

入棧這個根節點

根節點為此時root棧的棧頂

計算:(簡要說明)

非遞迴後序遍歷遇到數字入棧,遇到符號就出棧兩個元素計算然後將結果入棧

最後的棧頂元素為結果

出錯主要在於判斷條件順序沒弄對,導致段錯誤,還有就是對於出棧棧頂元素順序沒搞清楚,寫反了導致答案錯誤

;void select(node hufftree, int *a, int *b, int n)//找權值最小的兩個a和b

cout << endl;

}}string huff_decode(node hufftree, int n,string s)

else if (i == s.size()-1&&j==n-1&&temp!="")//全部遍歷後沒有}}

return str;

}int main()

; int w = ;

huff_tree(hufftree, w, str, n);

huff_code(hufftree, n);

//解碼過程

string s;

cout << "輸入編碼:";

cin >> s;

cout << huff_decode(hufftree, n, s)<< endl;;

system("pause");

return 0;

}

編碼的實現是先構造哈夫曼樹,通過遍歷哈夫曼樹,從每個葉子結點開始向上遍歷,如果該結點為父節點的左孩子,則在字串後面追加「0」,如果為其右孩子,則在字串後追加「1」。結束條件為沒有父節點。將字串倒序存入結點中。

部落格作業04 樹

在本章樹的學習中,可以說是掌握得特別虛。因為二叉樹的很多操作中都應用到了遞迴,而在上學期學習遞迴的時候就沒有掌握好,很多時候樹的幾個遞迴 會讓我沉思很久才能屢清楚整個過程,然而看懂 和會寫 還是有很大差別的,本次的pta在課本上可以找到很多相關的 情況下還是完成得跌跌撞撞的,更不敢想象如果是沒有遇到...

部落格作業04 樹

遞迴遍歷左右子樹 if 左子樹高度大於右子樹高度 返回左子樹高度 1 否則 返回右子樹高度 1 當bt null,返回0,遞迴呼叫結束 利用函式建樹 樹的左孩子為該節點i的 2i 樹的右孩子為該節點i的 2i 1 左子樹遞迴 bt lchild createbtree str,2 i 右子樹遞迴 b...

部落格作業04 樹

對於樹的遞迴做法看著簡單,自己寫的話很難下手 樹的性質還沒有記牢 運用樹來解題還是有困難,要多加學習 當陣列不空時 判斷是否為運算子不是則 建立新的節點,將此時的字元賦給節點,並將節點入棧 是則判斷該字元與棧頂字元的優先順序 大於則將其入棧 等於將棧頂元素出棧 小於則將棧頂元素賦予根節點,並將棧的接...