樹結構在實際應用中好像挺常見的,代碼的思路能夠整成樹,例如修理牧場的問題也能夠經過樹來解決問題 樹有多種儲存結構,雙親存儲,孩子鏈存儲,孩子兄弟存儲,能夠根據獲得的數據的特色來選擇合適的存儲結構 樹種常見的樹爲二叉樹,二叉樹的前中後遍歷分別能夠用於處理不一樣類型的問題 由二叉樹衍生出的線索二叉樹,根據線索二叉樹就能獲得它的先後都是什麼結點 哈夫曼樹是用來求得最優解,並查集樹能夠用來判斷是否屬於同一集合
根據後序和中序遍歷輸出先序遍歷
根據輸入的中序序列和後序序列,先肯定它的根節點的位置,用mid儲存 BT->data=後序序列的最後一個元素 BT->lchild=遞歸調用建樹函數,參數爲後序序列的第一個元素,中序序列的第一個元素,次數爲mid次,及k次 BT->rchild=遞歸調用建樹函數,參數爲後序序列的第mid個元素,中序序列的第mid-1個元素,次數爲n-mid-1次,即n-k-1次
Q1:部分正確是由於把遞歸裏面序列從哪一個元素開始寫錯了,致使了三個測試點段錯誤 A1:後來從新看了一遍, 而後改了過來就對了
jmu-ds-輸出二叉樹每層節點
定義兩個樹的變量,一個爲curNdoe,另外一個爲lastNode 定義一個樹結構類型的隊列q 定義int類型變量flag=1,level=1 curNode=lastNode=BT 若是樹不空則將一個結點進隊 while 隊列不空 取隊首賦給curNode 若是curNode有左孩子則進隊 若是有右孩子則進隊 若是 flag爲1,輸出層數level if curNode=lastNode,即curNode爲下一層的最後一個元素 將隊列裏的最後一個元素賦給lastNode(這樣就考科一繼續判斷下一層何時是最後一個元素) flag=1 輸出curNode指向的data和回車 else 輸出curNode指向的data flag=0; 出隊一個元素 end while
Q1:這題老師在上課時候已經給過思路了,可是那時的代碼的格式和pta裏要求的格式不同,而後本身在作的時候,在控制格式的時候和卡殼了樣,一直控制很差,而後次日從新打的時候,一會兒就想到了 A1:用一個flag就能夠解決,我以前想着要控制層數和換行要分開控制,才搞了好久 Q2:而後第二個問題,是經過測試數據發現錯在哪的,當左子樹的層數比右子樹的層數多就會出錯,由於這時右子樹的左右孩子都是空的,那麼lastNode就不會等於下面那層的最後邊的那個 A2:因而我有申請了一個tempNode,保存左邊的子樹,那麼lastNode就會指向那層的最後一個元素了 Q3:可是這樣作當只有一個根節點的時候,tempNode就會變成野指針 A3:在大佬的提點上,發現不用這麼麻煩,只須要讓lastNode等於對尾就能夠了,不須要判斷最後一個元素是在右子樹仍是左子樹上了
修理牧場
定義n和一個降序的優先隊列q 定義長度爲n的數組a,以及int型的變量 wpl=0 輸入n 輸入n個數,賦給數組a,以及進隊q while 隊列的長度大於1 定義min=取隊頂,出隊列 定義pmin=取隊頂,出隊列 將兩個值相加,再進隊 wpl+=min+pmin end while 輸出wpl
Q1:看到題目第一個想法就是用哈夫曼樹來處理,可是老師在上課講過,這題用哈夫曼會超時,能夠用容器優先隊列來作 A1:發現用優先隊列,進去的元素會自動排好,只要把前兩個相加,在把和放進去,繼續和裏面的數比較,將比較小的兩個數相加,就能夠解決這個問題了,比構建哈夫曼樹快多了 優先隊列升序堆:priority_queue<int> qmax; 優先隊列降序堆:priority_queue<int,vector<int>,greater<int> > qmin;
給定一個二叉搜索樹,編寫一個函數 kthSmallest 來查找其中第 k 個最小的元素。 說明: 你能夠假設 k 老是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。
由於是二叉查找樹,因此節點比左孩子小,比右孩子大, 使用遞歸的方法進行中序遍歷,遍歷的過程當中將節點爲第K小的元素,輸出便可
這題利用了中序遍歷的特色,輕鬆的輸出了第K小的元素 獲得的學習體會是,能夠根據其特色,靈活的將他們運用在各類適用的問題上