第04次做業-樹

1.學習總結

1.1樹結構思惟導圖

1.2 樹結構學習體會

認識:
樹是由n個節點組成的有限集合,它是一種非線性結構,它的每個結點能夠有0個或多個後繼結點,可是隻有一個前驅結點(除了根結點),數據元素之間存在一對多的關係。git

遇到的困難:
課上聽得懂老師講的內容,可是打代碼的時候又不知從何下手,對遞歸的理解也不夠透徹,打代碼的時候會被繞暈。函數

樹結構能夠解決的問題:
能夠將表達式進行轉換,處理家譜,查找文件等。學習

2.PTA實驗做業

2.1 題目1:6-3 先序輸出葉結點

2.2 設計思路

void PreorderPrintLeaves{
    if BT不爲0
        if只有一個根結點
            輸出根結點的元素
        end if
        end 
        PreorderPrintLeaves(BT->Left);
        if BT->Left的左子樹,右子樹均不爲空
            輸出BT結點的元素;
            end if
        PreorderPrintLeaves(BT->Right);
        if BT->Right的左子樹,右子樹均不爲空
            輸出BT結點的元素;
            end if
    end if 
    end 
}

2.3 代碼截圖

2.4 PTA提交列表說明。


錯誤:
一開始只有空樹的測試點是對的,而後加了判斷是否只有根結點後,對了另外兩個測試點,空樹變成了錯的。測試

解決方法:
將判斷是否只有根結點的代碼放到判斷樹是否爲空的代碼中,即可以經過。ui

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

2.2 設計思路

void InitExpTree(BTree &T,string str){
    定義棧s1存儲樹,s2存儲運算符;
    BTree BT,a,b;
    定義i等於0;
    while i<str.size()
    then    
        if str[i]不是運算符
            CreateExpTree( BT , NULL , NULL , str[i] );
            s1.push(BT);
        else
            if s2爲空
                將str[i]進棧s2;
                i++;
            end if
            else
                while s2不爲空,且s2棧頂元素的優先級小於str[i];
                then
                    將s1棧頂元素值賦給a;
                    s1出棧;
                    將s1棧頂元素值賦給b;
                    s1出棧;
                    CreateExpTree( BT ,a , b , s2.top() );
                    將BT入棧s1;
                    s2出棧;
                end while
                while S2不爲空,且s2棧頂元素的優先級大於str[i] 
                then
                    將str[i]入棧s2; 
                    i++;
                end while
                while  S2不爲空,且s2棧頂元素的優先級等於str[i]
                then
                    s2出棧;
                end while 
    end
    while s2不爲空
    then 
        將s1棧頂的值賦給a;
        s1出棧; 
        將s1棧頂的值賦給b;
        s1出棧;
        CreateExpTree( BT , a , b , s2.top() );
        s2出棧;
        BT入s1棧; 
    end while
    將s1.top的值賦給T; 
    
}

2.3 代碼截圖


2.4 PTA提交列表說明


錯誤:
沒有判斷棧是否爲空,加上之後仍是錯誤,尚未找到如何修改。設計

2.1 題目2:7-2 根據後序和中序遍歷輸出先序遍歷

2.2 設計思路

定義全局變量h[1000],z[1000]來存儲後序和中序 
int main()
{
    定義n,i;
    輸入n,h[i],z[i]的值;
    Tree head = RestoreTree(0,n-1,0,n-1);     
    輸出PostOrder;
    PostOrder(head);
}
Tree RestoreTree(int h1,int h2,int z1,int z2){
    Tree T;
    定義i;
    if h1>h2
        T爲空;
    end if
    else
        給T申請存儲空間;
        將h[h2]的值賦給T結點;
        for  i等於z1 to z2
            if z[i] 等於 h[h2];
                break;
        end
        T->left=RestoreTree(h1,h1+i-z1-1,z1,i);  
        T->right=RestoreTree(h1+i-z1,h2-1,i+1,z2); 
    end
    返回T; 
}
void PostOrder(Tree BT){
    輸出BT結點的值;
    PostOrder(BT->left);
    PostOrder(BT->right);
}

2.3 代碼截圖

2.4 PTA提交列表說明。


錯誤:
沒有看清楚題目,把給的後序遍歷當成了先序遍歷,覺得輸出格式是隻有數字之間要空格。3d

解決方法:
把後序遍歷的最後一個值賦給T,再將遞歸的時候傳入函數的值修改,輸出時是每一個數字前面都要一個空格,最後一個數末尾沒有空格。code

3.截圖本週題目集的PTA最後排名

3.1 PTA排名截圖

3.2 個人總分:1.5

4. 閱讀代碼(必作)


地址:blog

https://gitee.com/zhoubinghui/data_structure/blob/master/%E6%A0%91%E4%BB%A3%E7%A0%81/7-1%20%E8%BF%98%E5%8E%9F%E4%BA%8C%E5%8F%89%E6%A0%91.cpp

功能:
還原二叉樹遞歸

優勢:
經過使用遞歸函數,根據給出的樹的先序和中序遍從來還原二叉樹,思路清晰。

5. 代碼Git提交記錄截圖

相關文章
相關標籤/搜索