天天看點

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼

DS部落格作業05-樹

1.本周學習總結

1.思維導圖

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼

2.學習體會

對于這章,我感覺在課前預習時,看書做課堂派覺得自己挺懂,老師上課講的也大概能了解,但一到做題就不知所措,很迷茫,然後很多題也不會做。難道看書還是太疏忽了?沒記住哪些算法嗎?也許是新知識太多了,還有感覺這兩周老師上課上得挺快得,還沒從樹中走出來,圖就快完了,然後新得一章又來了(-_-)!唉!找時間看書消化消化吧!
           

2.PTA實驗作業

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

輸入一行中綴表達式,轉換一顆二叉表達式樹,并求解.
表達式隻包含+,-,*,/,(,)運算符,操作數隻有一位,且為整數(有興趣同學可以考慮負數小數,兩位數做法)。按照先括号,再乘除,後加減的規則構造二叉樹。
如圖所示是"1+(2+3)*2-4/5"代數表達式對應二叉樹,用對應的二叉樹計算表達式的值。 轉換二叉樹如下:
           

2.1.1設計思路(僞代碼)

void InitExpTree(BTree &T, string str)  //建表達式的二叉樹
{
        stack<BTree> s;   //存放結點的棧
        stack<char> op;    //存放操作符
        op.push('#');          //以#結束
         while(str[i]!='\0')    //周遊數組str
      {
         if(!In(str[i]) )  //操作數;
                 {
                       建立樹結點,并讓樹進棧;
                 }
                 else
        {
                       先判斷操作棧是否空
                       再比較數組和棧頂的大小關系
                       根據大小關系做相應的操作
                 }
          }
          while(op.top() !='#')    
            {
                       周遊棧
                       根據關系,找左孩子和右孩子,建樹
            }
}
double EvaluateExTree(BTree T)//計算表達式樹
{
          if (!T->lchild && !T->rchild)
        return T->data - '0';         
            value1 = EvaluateExTree(T->lchild);          //遞歸口,讓式子從葉子結點開始計算;
        value2 = EvaluateExTree(T->rchild);
            switch (T->data)      周遊樹
    {    
                 case '+':      
                case '-':
        case '*':     做相應的計算,并傳回式子的結果
        case '/':
        }
}
           

2.1.2代碼截圖

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼
DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼
DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼

2.1.3送出清單及說明

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼
  • Q1:段錯誤
  • A1:在比較數組和棧頂時忘記判斷棧是否空了。
  • Q2:編譯錯誤
  • A2:在編譯器上打代碼,不小心把全部代碼複制過去了。
  • Q3:答案錯誤
  • A3:在對棧做處理時,粗心大意,順序弄反了。

2.2題目二:7-4 jmu-ds-二叉樹葉子結點帶權路徑長度和 (25 分)

二叉樹葉子結點的帶權路徑長度指:葉子結點的權重路徑長度。本題要求算出二叉樹所有葉子結點的帶權路徑長度和。 如下面的二叉樹:
           

2.2.1設計思路(僞代碼)

BTree CreatTree(string str,int i)
{
       定義樹的結構變量bt
       當i>len-1或str[i]='#'
        傳回NULL
       申請結點BTNode
       将str[i]的值賦給bt->data
       遞歸調用函數CreatTree建構左右孩子
       傳回bt
}
void GetWPL(BTree bt,int h,int &wpl)
{
      判斷樹是否空,如果樹為空,傳回NULL
      如果左右孩子均不為空
      wpl+=bt->data-'0'乘以所在層數
      遞歸調用函數GetWpl,其中的h+1,得到所在層數 
}
           

2.2.2代碼截圖

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼
DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼

2.2.3送出清單及說明

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼
  • Q1:編譯錯誤
  • A1:沒注意到編譯器的文法改變。
  • Q2:段錯誤
  • A2:在比較i 和Len 時,以為直接return也可以,後面發現少了NULL不可以。

2.3題目三:7-5 jmu-ds-輸出二叉樹每層節點 (22 分)

~~

層次周遊樹中所有節點。輸出每層樹節點。

樹結構按照樹的先序周遊遞歸建樹,比如先序周遊字元串“ABD#G###CEH###F#I##”#代表空節點。對應樹結構如下圖,

~~~

2.3.1設計思路(僞代碼)

BinTree CreatBT(string str,int &i)
{
        當i>len-1或str[i]='#'
         傳回NULL
        定義樹的結構變量BT
        申請結點BTNode
        将str[i]的值賦給BT->data
        遞歸調用函數CreatTree建構左右孩子
        傳回bt
 }
void Print(BinTree BT) 
{
       定義樹的結構變量curNode,lastNode
       flag==1,表示該層輸出完成,level表示該結點第幾層
       把樹賦給curNode,lastNode,然後讓樹中的結點進棧 
       周遊棧,對頭賦給curNode,判斷為左孩子還是右孩子或者與lastNode相等,進行相應的指派 
       用flag控制樹層
       最後輸出棧頂
}
           

2.3.2代碼截圖

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼
DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼
DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼

2.3.3送出清單及說明

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼
  • Q1:部分正确
  • A1:對結點層數及該層所有結點的輸出格式混亂
  • A2:用flag控制輸出格式

3.閱讀代碼

3.1題目

給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,傳回從右側所能看到的節點值。
示例:
輸入: [1,2,3,null,5,null,4]
輸出: [1, 3, 4]
解釋:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---
           

3.2解題思路

用bfs算法對二叉樹進行層序周遊,儲存每層的最後一個節點
           

3.3代碼截圖

DS部落格作業05-樹DS部落格作業05-樹1.本周學習總結2.PTA實驗作業3.閱讀代碼

3.4學習體會

bfs算法為廣度優先搜尋(橫向)。class是将資料與方法封裝,讓行為與資料一緻的程式設計方法。與struct相同而又不同,class的成員預設是private,權限,struct預設是public權限。經百度得知integer是整型的意思,但C++裡隻有int,沒有這個資料類型,但在java裡有,且它是一個類, 是對象類型int的1原始類型。
           

轉載于:https://www.cnblogs.com/Gejkdj/p/10891682.html