認識:
樹是由n個節點組成的有限集合,它是一種非線性結構,它的每個結點能夠有0個或多個後繼結點,可是隻有一個前驅結點(除了根結點),數據元素之間存在一對多的關係。git
遇到的困難:
課上聽得懂老師講的內容,可是打代碼的時候又不知從何下手,對遞歸的理解也不夠透徹,打代碼的時候會被繞暈。函數
樹結構能夠解決的問題:
能夠將表達式進行轉換,處理家譜,查找文件等。學習
void PreorderPrintLeaves{ if BT不爲0 if只有一個根結點 輸出根結點的元素 end if end PreorderPrintLeaves(BT->Left); if BT->Left的左子樹,右子樹均不爲空 輸出BT結點的元素; end if PreorderPrintLeaves(BT->Right); if BT->Right的左子樹,右子樹均不爲空 輸出BT結點的元素; end if end if end }
錯誤:
一開始只有空樹的測試點是對的,而後加了判斷是否只有根結點後,對了另外兩個測試點,空樹變成了錯的。測試
解決方法:
將判斷是否只有根結點的代碼放到判斷樹是否爲空的代碼中,即可以經過。ui
void InitExpTree(BTree &T,string str){ 定義棧s1存儲樹,s2存儲運算符; BTree BT,a,b; 定義i等於0; while i<str.size() then if str[i]不是運算符 CreateExpTree( BT , NULL , NULL , str[i] ); s1.push(BT); else if s2爲空 將str[i]進棧s2; i++; end if else while s2不爲空,且s2棧頂元素的優先級小於str[i]; then 將s1棧頂元素值賦給a; s1出棧; 將s1棧頂元素值賦給b; s1出棧; CreateExpTree( BT ,a , b , s2.top() ); 將BT入棧s1; s2出棧; end while while S2不爲空,且s2棧頂元素的優先級大於str[i] then 將str[i]入棧s2; i++; end while while S2不爲空,且s2棧頂元素的優先級等於str[i] then s2出棧; end while end while s2不爲空 then 將s1棧頂的值賦給a; s1出棧; 將s1棧頂的值賦給b; s1出棧; CreateExpTree( BT , a , b , s2.top() ); s2出棧; BT入s1棧; end while 將s1.top的值賦給T; }
錯誤:
沒有判斷棧是否爲空,加上之後仍是錯誤,尚未找到如何修改。設計
定義全局變量h[1000],z[1000]來存儲後序和中序 int main() { 定義n,i; 輸入n,h[i],z[i]的值; Tree head = RestoreTree(0,n-1,0,n-1); 輸出PostOrder; PostOrder(head); } Tree RestoreTree(int h1,int h2,int z1,int z2){ Tree T; 定義i; if h1>h2 T爲空; end if else 給T申請存儲空間; 將h[h2]的值賦給T結點; for i等於z1 to z2 if z[i] 等於 h[h2]; break; end T->left=RestoreTree(h1,h1+i-z1-1,z1,i); T->right=RestoreTree(h1+i-z1,h2-1,i+1,z2); end 返回T; } void PostOrder(Tree BT){ 輸出BT結點的值; PostOrder(BT->left); PostOrder(BT->right); }
錯誤:
沒有看清楚題目,把給的後序遍歷當成了先序遍歷,覺得輸出格式是隻有數字之間要空格。3d
解決方法:
把後序遍歷的最後一個值賦給T,再將遞歸的時候傳入函數的值修改,輸出時是每一個數字前面都要一個空格,最後一個數末尾沒有空格。code
地址:blog
https://gitee.com/zhoubinghui/data_structure/blob/master/%E6%A0%91%E4%BB%A3%E7%A0%81/7-1%20%E8%BF%98%E5%8E%9F%E4%BA%8C%E5%8F%89%E6%A0%91.cpp
功能:
還原二叉樹遞歸
優勢:
經過使用遞歸函數,根據給出的樹的先序和中序遍從來還原二叉樹,思路清晰。