樹就是非線性數據結構 我以爲最可貴仍是對於遞歸的理解與應用吧,一樣的一個目標好比,遍歷樹,若是用非遞歸來作的話 代碼量不少可是若是用遞歸的方法來計算的話,就只需短短几行。遞歸的確具備很高的簡潔與高效性。
輸入一行中綴表達式,轉換一顆二叉表達式樹,並求解. 表達式只包含+,-,*,/,(,)運算符,操做數只有一位,且爲整數(有興趣同窗能夠考慮負數小數,兩位數作法)。按照先括號,再乘除,後加減的規則構造二叉樹。 轉換二叉樹以下: ![](https://img2018.cnblogs.com/blog/1474675/201905/1474675-20190524223551878-1917624259.png)
建表達式二叉樹 建op棧,op.push('#') 初始化根節點棧:stacktree棧 while(表達式未結束) if(ch==操做數) then 生成一個只有根結點的子樹T stacktree.push(T) if(ch==運算符) then while(ch<op棧頂運算符) 棧頂優先級高,則 建立一個樹結點T,數據爲op.top() stacktree彈出2個根結點T1,T2 T->lchild=T1,T->rchild=T2 stacktree.push(T) if(ch>op頂運算符) op.push(ch) if(ch==op頂運算符) 則op.pop() 計算表達式樹 double sum=0 if(T不爲空) then if(左右子樹不爲空) then 返回對應數值 遞歸左右子樹獲得a,b switch(結點值) case +:計算並返回a+b case - : 計算並返回a-b case * : 計算並返回a*b case / : if(除數爲0) then 直接輸出錯誤並退出 else 計算並返回a/b
Q:沒有考慮括號兩個括號相遇時要出棧c++
農夫要修理牧場的一段柵欄,他測量了柵欄,發現須要N塊木頭,每塊木頭長度爲整數Li個長度單位,因而他購買了一條很長的、能鋸成N塊的木頭,即該木頭的長度是Li的總和。 可是農夫本身沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。爲簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度爲20的木頭鋸成長度爲八、7和5的三段,第一次 鋸木頭花費20,將木頭鋸成12和8;第二次鋸木頭花費12,將長度爲12的木頭鋸成7和5,總花費爲32。若是第一次將木頭鋸成15和5,則第二次鋸木頭花費15,總花費爲35(大於32)。 請編寫程序幫助農夫計算將木頭鋸成N塊的最少花費。
定義n和一個降序的優先隊列q 定義長度爲n的數組a,以及int型的變量 wpl=0 輸入n 輸入n個數,賦給數組a,以及進隊q while 隊列的長度大於1 定義min=取隊頂,出隊列 定義pmin=取隊頂,出隊列 將兩個值相加,再進隊 wpl+=min+pmin end while 輸出wpl
Q:考慮q.size()的範圍時出錯,致使結果錯了
本題要求實現一個函數,按照中序遍歷的順序輸出給定二叉樹中度爲1的結點。
if BT結點爲空,返回 ifBT結點不空 遞歸遍歷左孩子 判斷度是否爲1//左孩子空右孩子不空或左孩子不空右孩子空 是 輸出 不是 end if 遞歸遍歷右孩子 end if
這題其實沒什麼大問題,就是學了c++會容易遺忘之前c的注意點,而後再編譯器裏瘋狂找錯誤
給出一串數字,而後判斷是否是先增後減
兩個變量交替,flag判斷開始是不是上升,若是不是,那麼就不成立, up=1表明如今是上升區段,反之,遞減區段,ans記錄段數
巧妙運用flag來控制增減,而後用if來作比較