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