二叉樹複習以及部分常見習題

今天覆習了二叉樹的鏈式存儲結構,又發現了之前忽略的一些細節問題,現在總結整理如下

問題一:
在字符串賦值函數中,未將全局變量初始化造成錯誤,說明對全局變量理解不夠深入,錯誤代碼及改正如下:

Status StringAssign(String S,char * chars){
    int index=1;/*2016-05-11  驚奇的發現這句很重要,找了半天才發現這個錯誤*/
    if(strlen(chars)>MAXSIZE)
       return ERROR;
    else{
        S[0]=strlen(chars);
        for(index=1;index<=S[0];index++)
            S[index]=*(chars+index-1);
    }
}

問題二:在用遞歸求二叉樹深度時,寫完if(T->Lchild)之後,沒有寫else的情況,導致程序出錯,說明對遞歸的理解還不夠,還需要多加練習,改正如下:

Status DepthBiTree(BiTree T){
    int left=0,right=0;
    if(!T)
       return 0;
    else{
        if(T->Lchild)
            left=DepthBiTree(T->Lchild);
        else
            left=0;
        if(T->Rchild)
            right=DepthBiTree(T->Rchild);
        else
            right=0;
    }
    return left>right? left+1:right+1;/*結尾一定要加判斷*/
}

下面記錄部分習題:

Q1:給定二叉樹T,計算其全部節點個數
A:對於計算二叉樹中個數的問題,優先考慮遞歸,本題代碼如下:

Status NodesNum(BiTree T){
    if(!T)/*樹爲空時返回0*/
       return 0;
    else{
        return (NodesNum(T->Lchild)+NodesNum(T->Rchild)+1);/*不爲空時返回左子樹節點數+右子樹節點個數+根節點*/
    }
}

Q2:給定二叉樹T,打印其全部葉子節點
A:常規方法當然是判斷二叉樹每個節點是否是葉子節點,是則打印,不是則繼續向後判斷。較爲複雜,但是用遞歸則可以輕鬆地解決,代碼如下:

Status PrintLeaves(BiTree T){
    if(!T)/*空樹*/
      return ERROR;
    else{
        if(!T->Lchild&&!T->Rchild)/*沒有左右子樹,即爲葉子節點,下一步操作是打印*/
           Visit(T->data);
        else/*有左右子樹,則打印其左右子樹的葉子節點*/
           PrintLeaves(T->Lchild);
           PrintLeaves(T->Rchild);
    }
}

Q3:給定二叉樹T,求其葉子節點個數
A:依然使用遞歸,聲明兩個變量NumL,NumR,代表左右子樹的葉子節點個數,代碼如下:

    int numL,numR;
    if(!T)/*空樹返回0*/
       return 0;
    else{/*不爲空*/
        /*如果沒有左右子樹,則是葉子節點,返回1*/
        if(!T->Lchild&&!T->Rchild)
            return 1;
        /*不是左右子樹,則計算其左右子樹的葉子節點個數並賦值給numL,numR,之後返回兩變量之和*/
        else{
            numL=LeaveNum(T->Lchild);
            numR=LeaveNum(T->Rchild);
            return (numL+numR);
        }
    }
}

遞歸是解決二叉樹相關問題中常見的方法,要多加練習,以便能夠熟練應用.

2015-05-11
於教學實驗綜合樓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章