學習了樹結構以後,整體感受比以前的兩種結構,線性和棧隊列都要複雜,由於樹形結構的實現方法不是惟一的,能夠用到鏈式結構,也能夠用到遞歸操做。在學習遞歸的時候,須要明確遞歸口和遞歸傳入的參數,剛開始學習的時候,這兩塊地方老是會不清楚。結構體也是樹必不可少的,須要明白何時須要兄弟節點,何時須要的是左右孩子節點,這個也是一個須要明確的地方。建樹以及各類須要的函數得在主函數中串聯起來,函數中須要的變量也要在主函數中聲明,BTree bt這個指針須要動態分配內存。總的來講,樹結構仍是須要多看視頻和多作題纔會有感受。算法
7-3 jmu-ds-二叉樹層次遍歷 (25 分)
層次遍歷樹中全部節點。 輸入一行字符串表示二叉樹的順序存儲結構,好比字符串「#ABCD#EF#G##H##I」,#表明空節點。第一個#不使用。數組
·Q1:第一次的錯誤在於對輸出沒有注意到,也就是PreOrder實際上是個沒有用的函數
·A1:把主函數中的PreOrder註釋掉
·Q2:第二次錯誤在於遍歷的那個函數沒有使用兩個指針,我覺得一個就夠了,沒想到在後面逐層遍歷的時候出問題了
·A2:定義兩個指針,直接把樹用另一個棧進行操做函數
7-4 jmu-ds-二叉樹葉子結點帶權路徑長度和 (25 分)
二叉樹葉子結點的帶權路徑長度指:葉子結點的權重路徑長度。本題要求算出二叉樹全部葉子結點的帶權路徑長度和。 以下面的二叉樹:學習
·Q1:第一次的答案錯誤是由於wpl函數裏面的遞歸沒法直接使用lchild和rchild vs提出錯誤
·A1:在主函數和wpl函數中都聲明瞭一下發現沒有改變問題 就暫時沒去動這個問題
·Q2:檢查完程序以後發現主函數中函數調用傳參出了問題 應該把1傳進去而不是n
·A2:修改以後進行提交 直接就過了 第一個問題看起來不是大問題 可是不知道爲啥vs報錯了設計
本題要求根據給定的一棵二叉樹的後序遍歷和中序遍歷結果,輸出該樹的先序遍歷結果。3d
·Q1:第一次錯誤的緣由是宏定義數組的時候類型聲明錯誤 定義成char類型的了後面輸入的時候就有問題
·A2:改變了定義類型 使用整型輸入
·Q2:第二次錯誤是格式錯誤 在最後輸出的時候多出了一個空格
·A2:調整一下輸出指針
有一棵二叉樹,樹上每一個點標有權值,權值各不相同,請設計一個算法算出權值最大的葉節點到權值最小的葉節點的距離。二叉樹每條邊的距離爲1,一個節點通過多少條邊到達另外一個節點爲這兩個節點之間的距離。
給定二叉樹的根節點root,請返回所求距離。視頻
這道題的解題較爲麻煩,分做兩大步驟
1 標記每一個節點的父節點,而且找出最大葉節點和最小葉節點
用map<int,pair<int,int>>標記每一個子節點的父節點,first是子節點值,second是<父節點值,父節點位置>
用queue遍歷二叉樹的節點
依次把每一個父節點的子節點push進隊列,每取出一個節點處理,計數加1,而後處理取出節點的左右孩子進行標記
處理完以後,把取出的節點pop出去
2 計算兩個葉節點的最短路徑
分別找出兩個葉節點到樹根的路徑,公共部分之前的路徑相加即最短路徑blog
沒想到孰能解決的問題這麼多,這道題看起來不是很難,只要找出權值最大的節點和權值最小的葉節點,而後在計算他們之間的距離。可是實際操做起來的話,首先找權值的問題是要先遍歷一遍整棵樹,把權值記錄下來,而後進行比較找出兩個節點,而後在進行遍歷,便利的同時記錄下來路徑,存放好路徑以後再使用一個函數進行計算路徑。這道題用了不少的書的操做,建立左右子樹,遍歷子樹,而後就是棧和隊列的操做,很值得學習和深思。遞歸