DS博客做業05--樹

DS博客做業05--樹

1.本週學習總結

1.思惟導圖

2.談談你對樹結構的認識及學習體會

樹就是非線性數據結構
    我以爲最可貴仍是對於遞歸的理解與應用吧,一樣的一個目標好比,遍歷樹,若是用非遞歸來作的話
代碼量不少可是若是用遞歸的方法來計算的話,就只需短短几行。遞歸的確具備很高的簡潔與高效性。

2.PTA實驗做業

2.1題目1:6-4 jmu-ds-表達式樹

輸入一行中綴表達式,轉換一顆二叉表達式樹,並求解.
表達式只包含+,-,*,/,(,)運算符,操做數只有一位,且爲整數(有興趣同窗能夠考慮負數小數,兩位數作法)。按照先括號,再乘除,後加減的規則構造二叉樹。
 轉換二叉樹以下:
![](https://img2018.cnblogs.com/blog/1474675/201905/1474675-20190524223551878-1917624259.png)

2.1.1設計思路(僞代碼)

建表達式二叉樹
建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

2.1.2代碼截圖




2.1.3本題PTA提交列表說明


Q:沒有考慮括號兩個括號相遇時要出棧c++

2.2題目1:修理牧場

農夫要修理牧場的一段柵欄,他測量了柵欄,發現須要N塊木頭,每塊木頭長度爲整數Li個長度單位,因而他購買了一條很長的、能鋸成N塊的木頭,即該木頭的長度是L​i的總和。
可是農夫本身沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。爲簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度爲20的木頭鋸成長度爲八、7和5的三段,第一次
鋸木頭花費20,將木頭鋸成12和8;第二次鋸木頭花費12,將長度爲12的木頭鋸成7和5,總花費爲32。若是第一次將木頭鋸成15和5,則第二次鋸木頭花費15,總花費爲35(大於32)。
請編寫程序幫助農夫計算將木頭鋸成N塊的最少花費。

2.2.1設計思路(僞代碼)

定義n和一個降序的優先隊列q
定義長度爲n的數組a,以及int型的變量 wpl=0
輸入n
輸入n個數,賦給數組a,以及進隊q
while 隊列的長度大於1
    定義min=取隊頂,出隊列
    定義pmin=取隊頂,出隊列
    將兩個值相加,再進隊
    wpl+=min+pmin
end while
輸出wpl

2.2.2代碼截圖

2.2.3本題PTA提交列表說明

Q:考慮q.size()的範圍時出錯,致使結果錯了

2.3.題目1:6-2 中序輸出度爲1的結點

本題要求實現一個函數,按照中序遍歷的順序輸出給定二叉樹中度爲1的結點。

2.3.1設計思路(僞代碼)

if BT結點爲空,返回
    ifBT結點不空
    遞歸遍歷左孩子
    判斷度是否爲1//左孩子空右孩子不空或左孩子不空右孩子空
    是 輸出
    不是 end if
    遞歸遍歷右孩子
    end if

2.3.2代碼截圖

2.3.3本題PTA提交列表說明

這題其實沒什麼大問題,就是學了c++會容易遺忘之前c的注意點,而後再編譯器裏瘋狂找錯誤

3.閱讀代碼

3.1 題目

給出一串數字,而後判斷是否是先增後減

3.2 解題思路

兩個變量交替,flag判斷開始是不是上升,若是不是,那麼就不成立,
up=1表明如今是上升區段,反之,遞減區段,ans記錄段數

3.3 代碼截圖

3.4 學習體

巧妙運用flag來控制增減,而後用if來作比較
相關文章
相關標籤/搜索