最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中二叉樹的后序遍歷詳解

 更新時(shí)間:2022年01月24日 16:04:23   作者:guo5411  
大家好,本篇文章主要講的是C語言中二叉樹的后序遍歷詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下

首先我們從兩個(gè)方面講解二叉樹的后序遍歷(遞歸+迭代)

一.二叉樹的后序遍歷.(遞歸)

思想:

首先我們從二叉樹的根節(jié)點(diǎn)開始先遍歷其左孩子,①接著同樣繼續(xù)遍歷其左孩子的左孩子,直到某個(gè)左孩子節(jié)點(diǎn)的左孩子為NULL時(shí),②開始遍歷其右孩子,如果其為NULL則訪問該節(jié)點(diǎn)的值域,并返回其雙親節(jié)點(diǎn)重復(fù)第二步的操作,如果其不為NULL則以該節(jié)點(diǎn)為根節(jié)點(diǎn)重復(fù)第一步的操作.直到訪問完所有節(jié)點(diǎn)時(shí)結(jié)束遞歸.

代碼:

void BTreePostOrder(struct TreeNode* root,int* arry,int* Size){//后序遍歷
    if(NULL==root){//遞歸出口
        return;
    }
    BTreePostOrder(root->left,arry,Size);//遍歷左孩子
    BTreePostOrder(root->right,arry,Size);//遍歷右孩子
    arry[(*Size)++]=root->val;//訪問該節(jié)點(diǎn)
}

運(yùn)行過程:(如圖)

二.二叉樹的后序遍歷(迭代)

我們應(yīng)該知道二叉樹的前中后序遍歷使用遞歸非常的簡單,但是如果用迭代的話就比較有難度了,因此我思考了很久有沒有一種迭代類型的算法與遞歸的框架相似(遞歸的三種算法框架非常相似只要會(huì)一個(gè)其他的便很好寫出來),我們是否可以寫出一種迭代算法:只用改變訪問結(jié)點(diǎn)的次序便可以在迭代的方式下實(shí)現(xiàn)二叉樹的前中后序遍歷,因此我們使用數(shù)據(jù)結(jié)構(gòu)中棧來模仿遞歸的形式實(shí)現(xiàn)了二叉樹的前序遍歷(在進(jìn)棧時(shí)訪問結(jié)點(diǎn)值域),中序遍歷(在出棧時(shí)訪問結(jié)點(diǎn)的值域),這種方法可以在同一種框架中實(shí)現(xiàn)迭代層面二叉樹的前序遍歷和中序遍歷,但是到了后序遍歷就沒辦法了,之后經(jīng)過思考前序遍歷與后序遍歷的關(guān)系從而實(shí)現(xiàn)了同一種框架中實(shí)現(xiàn)前中后序遍歷的迭代算法.

1.相信很多人在剛學(xué)習(xí)二叉樹時(shí)都遇到過這種問題,選擇題給定一顆二叉樹,讓我們給出二叉樹的前中后序遍歷的節(jié)點(diǎn)順序.(每個(gè)人都有自己的計(jì)算方法),下面說一下我的計(jì)算方法.

前序:我們按圖中紅色箭頭的順序和其指向依次讀取箭頭上的結(jié)點(diǎn)便可得到其前序遍歷.

中序:我們按圖中紅色箭頭的順序和其指向依次讀取箭頭上的結(jié)點(diǎn)便可得到其中序遍歷.

后序:我們按圖中紅色箭頭的順序和其指向依次讀取箭頭上的結(jié)點(diǎn)便可得到其后序遍歷.

經(jīng)過上圖我們可以看出二叉樹的后序遍歷剛好與從右孩子開始的前序遍歷所得到的的值完全相反.因此我們可以使用前序遍歷的代碼從右孩子開始進(jìn)行前序遍歷,最后將得到的值反向打印即可.

代碼:

typedef struct TreeNode BTNode;
 
typedef struct Stack{//棧的結(jié)構(gòu)體
    BTNode* array[100];
    int size;
}Stack;
 
void StackPush(Stack* a,BTNode* root){//入棧
    a->array[(a->size)++]=root;
}
 
void StackPop(Stack* a){//出棧
    (a->size)--;
}
 
void Reverse(int* a,int Long){//反向打印
    int left_1=0;
    int right_1=Long-1;
    while(left_1 < right_1){
        int temp=a[left_1];
        a[left_1]=a[right_1];
        a[right_1]=temp;
        left_1++;
        right_1--;
    }
}
 
int* postorderTraversal(struct TreeNode* root, int* returnSize){//從右孩子開始的前序遍歷
    int* b=(int*)malloc(sizeof(int)*100);
    if(NULL==b){
        printf("申請節(jié)點(diǎn)失敗!\n");
        return NULL;
    }
    Stack a;
    a.size=0;
    BTNode* root_temp;
    int i=0;
    StackPush(&a,root);
    while(NULL != a.array[a.size-1]){
        b[i++]=a.array[a.size-1]->val;
        StackPush(&a,a.array[a.size-1]->right);
        while(NULL == a.array[a.size-1]){
            StackPop(&a);
            if(0 == a.size){
                Reverse(b,i);           
                (*returnSize)=i;
                return b;
            }
            root_temp=a.array[a.size-1];
            StackPop(&a); 
            StackPush(&a,root_temp->left);
        }
    }
    Reverse(b,i);
    (*returnSize)=i;
    return b;
}

從右孩子開始的前序遍歷:正常的前序遍歷是先訪問節(jié)點(diǎn),然后遍歷其左孩子,再遍歷其右孩子.而該前序遍歷是先訪問節(jié)點(diǎn),然后遍歷其右孩子,再遍歷其左孩子.

代碼:

void BTreeInOrder(struct TreeNode* root,int* arry,int* Size){//前序遍歷
    if(NULL==root){//遞歸出口
        return;
    }
    arry[(*Size)++]=root->val;//訪問該節(jié)點(diǎn)
    BTreeInOrder(root->right,arry,Size);//遍歷右孩子
    BTreeInOrder(root->left,arry,Size);//遍歷左孩子
}

具體比較如圖:

總結(jié)

到此這篇關(guān)于C語言中二叉樹的后序遍歷詳解的文章就介紹到這了,更多相關(guān)C語言二叉樹的后序遍歷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 用貪心法求解背包問題的解決方法

    用貪心法求解背包問題的解決方法

    本篇文章是對用貪心法求解背包問題的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)LeetCode(163.缺失區(qū)間)

    C++實(shí)現(xiàn)LeetCode(163.缺失區(qū)間)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(163.缺失區(qū)間),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解C++編程中運(yùn)算符的使用

    詳解C++編程中運(yùn)算符的使用

    這篇文章主要介紹了詳解C++編程中運(yùn)算符的使用,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09
  • C++ 中類(class)和結(jié)構(gòu)體(struct)的區(qū)別

    C++ 中類(class)和結(jié)構(gòu)體(struct)的區(qū)別

    類和結(jié)構(gòu)體經(jīng)常被用來定義復(fù)雜的數(shù)據(jù)結(jié)構(gòu),但兩者之間既有區(qū)別又能很好地結(jié)合使用,本文主要介紹了C++ 中類(class)和結(jié)構(gòu)體(struct)的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-04-04
  • C++文件IO流及stringstream流讀寫文件和字符串操作詳解

    C++文件IO流及stringstream流讀寫文件和字符串操作詳解

    本文詳細(xì)介紹C++中的文件IO流和stringstream流的使用方法,包括文件的打開、讀寫操作,以及字符串的輸入輸出、轉(zhuǎn)換等操作。同時(shí)提供實(shí)用的示例代碼和技巧,幫助讀者更好地掌握這兩種流的使用
    2023-04-04
  • C?語言注釋和變量使用基礎(chǔ)詳解

    C?語言注釋和變量使用基礎(chǔ)詳解

    這篇文章主要為大家介紹了C語言注釋和變量使用示例基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • C語言實(shí)現(xiàn)電影院選座管理系統(tǒng)

    C語言實(shí)現(xiàn)電影院選座管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)電影院選座管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++左值和右值學(xué)習(xí)筆記

    C++左值和右值學(xué)習(xí)筆記

    這篇文章主要為大家介紹了C++左值和右值學(xué)習(xí)筆記的重點(diǎn)講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • C++ std:map的使用方法

    C++ std:map的使用方法

    std::map是C++標(biāo)準(zhǔn)庫中一個(gè)強(qiáng)大而高效的關(guān)聯(lián)容器,本文就來介紹一下C++ std:map的使用方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • 解析C++中的5個(gè)存儲(chǔ)類的作用

    解析C++中的5個(gè)存儲(chǔ)類的作用

    這篇文章主要介紹了C++中的5個(gè)存儲(chǔ)類的作用,存儲(chǔ)類是管理對象的生存期、鏈接和內(nèi)存位置的類型說明符,需要的朋友可以參考下
    2016-05-05

最新評論

彭阳县| 柘荣县| 武宁县| 金昌市| 原平市| 尚志市| 曲周县| 乌恰县| 昌都县| 灵石县| 澄城县| 马龙县| 怀宁县| 庄河市| 陕西省| 阆中市| 峡江县| 普兰店市| 古交市| 文山县| 揭东县| 利津县| 栾川县| 温宿县| 沂源县| 水富县| 汶上县| 称多县| 安远县| 文安县| 霞浦县| 工布江达县| 江达县| 密云县| 安丘市| 古蔺县| 留坝县| 石家庄市| 华安县| 康定县| 策勒县|