DS博客做業05--樹

1.本週學習總結(0--2分)

1.思惟導圖

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

  • 本週學習了樹和二叉樹這一結構,對於以前的結構來講,我以爲難了不少,首先這個結構有孩子結點,兄弟結點,雙親結點等, 首先從建立樹的結構來講就複雜了不少,在對樹的不少操做中用到了不少遞歸的算法,這對於原本以前遞歸算法就不太理解的我來講挺難的,並且一旦程序寫錯了,遞歸算法很不容易發現錯誤,因此在寫樹的相關程序的時候,最重要的我以爲仍是整個思路的問題,有些遞歸算法不太容易想出來,而一旦想出來問題就變得簡單不少了。ios

  • 二叉樹有先序,中序,後序遍歷等遍歷樹的方法,其中還有相關的轉換,這個問題感受很難,理解三種的轉化還挺容易,可是代碼的實現特別難寫...感受要看好多好多遍才能記住...總結就是這章的知識點挺多的c++

2.PTA實驗做業(6分)

2.1 6-4 jmu-ds-表達式樹 (25 分)

2.1.1設計思路(僞代碼)

void InitExpTree(BTree &T,string str)  //建表達式的二叉樹
{
        定義一個棧s存放數字 
        定義一個棧op 存放運算符 
        ‘#’進op棧;
        while遍歷str 給樹結點賦值 
        {
            If str[i]爲數字
            {
                新建樹結點T=new BiTNode;
                T->data=str[i++];T的左右孩子都置爲空
                T入s棧;
            }
            else是運算符
            {
                switch調用precede函數比較op棧頂和str[i]
                {   
                    case'<':str[i++]入棧op
                    case'=':op棧出棧 
                    case'>':
                        新建結點T,T->data=op.top()
                        T->rchild=s.top();s棧出棧
                        T->lchild=s.top();s棧出棧
                        新建的T結點入s棧
                        op棧出棧
                }
        } 
        while(op棧頂元素不是'#') //把樹結點的關係連起來 
        { 
            新建結點T; 
            T->data=op.top();op棧出棧
            T->rchild=s.top(); s棧出棧 
            T->lchild=s.top();s棧出棧 
            T結點進s棧
        }
}
double EvaluateExTree(BTree T)計算表達式樹
{
        定義a,b
        if  樹T不空
            if 左右孩子都爲空 return T->data-'0';
            a=EvaluateExTree(T->lchild)
            b=EvaluateExTree(T->rchild)
            switch T->data
                case'+':return a+b
                case'-':rerurn a-b
                case'*':return a*b
                case '/':
                    if b==0 輸出divide 0 error!
                    else return a/b
}

2.1.2代碼截圖




2.1.3本題PTA提交列表說明

  • Q1:這題剛開始沒有什麼思路,不明白具體怎樣把表達式建成樹
  • A1:查了一下思路,主要是建兩個棧s和op分別用來存放數字和運算符,遇到數字就賦給樹結點T而後入s棧,遇到運算符和以前棧的題目差很少,要比較與op棧頂的符號的前後級,小於直接進op棧,大於則要先把op棧頂的運算符與s棧中元素的關係創建,而後再將T進s棧。等於直接op棧出棧,如此創建樹,而後計算輸出。

2.2.題目2:7-1 還原二叉樹 (25 分)

2.2.1設計思路(僞代碼)

#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
定義字符型數組 str1[110],str2[110];
int main()
{
    int n;
    輸入結點個數n;
    輸出str1 str2;
    輸出二叉樹高度
    return 0;
}
int dfs(char a[],char b[],int m)
{
    if m==0
        return 0;//沒有節點,爲空樹
    end if
    int i;
    for i=0 to i<m
    {
        if b[i]==a[0] //找到根節點在中序的位置
             break;
    }
    end for
    int c=dfs(a+1,b,i)+1;//左子樹的深度
    int d=dfs(a+i+1,b+i+1,m-i-1)+1;//右子樹的深度
    int h;
    if c>d
    h=c++;
    else
    h=d++;
    return h;
}

2.2.2代碼截圖(注意,截圖,截圖,截圖。不要粘貼博客上。)


2.2.3本題PTA提交列表說明。

  • Q1:這題的主要問題就是思路上還原二叉樹廳容易,可是在代碼實現上不是很容易想到,運用了遞歸算法
  • A1:主要仍是對遞歸算法不是很熟悉,先找到樹根,中序序列的樹根前面的字符串是其左子樹,後面是右子樹。再將左子樹和右子樹的序列分別做爲一棵樹進入遞歸,對其重複找出樹根和左右子樹的處理,每次記錄下當前左右子樹的深度,最後返回最大深度

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

2.3.1設計思路(僞代碼)

main函數和建樹函數CreatTree(string str, int &i)
void LevelOrder(BinTree BT)  //層次遍歷
{
    定義BinTree型隊列qt;
    int level,flag;
    定義BinTree結構體curNode,lastNode;
    curNode=lastNode=BT;
    if BT==NULL 
            輸出NULL
            return ;
    else
            BT進隊
        while(隊qt不爲空)
        {
                if  curNode==lastNode 
                {
                        level++;
                        用flag控制換行
                        lastNode=qt.back();
                }
        end if
                curNode=qt.front();     
                輸出curNode->Data
                if  curNode->Left不爲空
                    curNode->Left進隊qt
                if  curNode->Right非空
                    curNode->Right進隊qt
            qt隊出隊
        }
}

2.3.2代碼截圖(注意,截圖,截圖,截圖。不要粘貼博客上。)



2.3.3本題PTA提交列表說明。

  • 其實是二叉樹的層次遍歷,先將根結點A入隊,而後出隊,訪問A,將A的左右孩子BC入隊,出隊,而後再訪問BC的左右孩子,按照以上方法,入隊,出隊,訪問並將他的左右孩子入隊,直到隊列爲空。

三、閱讀代碼(-2--2分)

3.1 題目尋找重複的子樹

給定一棵二叉樹,返回全部重複的子樹。對於同一類的重複子樹,你只須要返回其中任意一棵的根結點便可。
兩棵樹重複是指它們具備相同的結構以及相同的結點值

下面是兩個重複的子樹:
算法

3.2 解題思路

經過map記錄每顆子樹先序遍歷或者後序遍歷的結果, 找到全部遍歷結果相同的子樹。數組

3.3 代碼截圖

3.4 學習體會

  • 這題的話仍是用到的遞歸算法,還有hash數組,同時結構不一樣的子樹單純的後序或是先序遍歷可能結果同樣,能夠作一下特殊處理,即空樹的遍歷結果爲某個特殊字符,這樣一顆樹的遍歷結果就被惟一限定了
  • 看了挺多力扣上的題,大部分其實都用到很巧妙的遞歸算法,代碼很簡練,因此在遞歸上的思路和理解運用上還要多多練習。
相關文章
相關標籤/搜索