1. 程式人生 > >用C++實現二叉樹的三種遍歷方式

用C++實現二叉樹的三種遍歷方式

- 非遞迴實現程式碼:

#include<stdio.h>
#include<stdlib.h>
#include"data_structure.h"

//建立一棵二叉樹
BTree create_tree()
{
    BTree pA = (BTree)malloc(sizeof(BTNode));
    BTree pB = (BTree)malloc(sizeof(BTNode));
    BTree pD = (BTree)malloc(sizeof(BTNode));
    BTree pE = (BTree)malloc(sizeof(BTNode));
    BTree pC =
(BTree)malloc(sizeof(BTNode)); BTree pF = (BTree)malloc(sizeof(BTNode)); pA->data = 'A'; pB->data = 'B'; pD->data = 'D'; pE->data = 'E'; pC->data = 'C'; pF->data = 'F'; pA->pLchild = pB; pA->pRchild = pC; pB->pLchild = pD; pB->
pRchild = pE; pD->pLchild = pD->pRchild = NULL; pE->pLchild = pE->pRchild = NULL; pC->pLchild = pF; pC->pRchild = NULL; pF->pLchild = pF->pRchild = NULL; return pA; } /* 前序遍歷的非遞迴實現 */ void pre_traverse(BTree pTree) { PSTACK stack = create_stack(); //建立一個空棧
BTree node_pop; //用來儲存出棧節點 BTree pCur = pTree; //定義用來指向當前訪問的節點的指標 //直到當前節點pCur為NULL且棧空時,迴圈結束 while(pCur || !is_empty(stack)) { //從根節點開始,輸出當前節點,並將其入棧, //同時置其左孩子為當前節點,直至其沒有左孩子,及當前節點為NULL printf("%c ", pCur->data); push_stack(stack,pCur); pCur = pCur->pLchild; //如果當前節點pCur為NULL且棧不空,則將棧頂節點出棧, //同時置其右孩子為當前節點,迴圈判斷,直至pCur不為空 while(!pCur && !is_empty(stack)) { pCur = getTop(stack); pop_stack(stack,&node_pop); pCur = pCur->pRchild; } } } /* 中序遍歷的非遞迴實現 */ void in_traverse(BTree pTree) { PSTACK stack = create_stack(); //建立一個空棧 BTree node_pop; //用來儲存出棧節點 BTree pCur = pTree; //定義指向當前訪問的節點的指標 //直到當前節點pCur為NULL且棧空時,迴圈結束 while(pCur || !is_empty(stack)) { if(pCur->pLchild) { //如果pCur的左孩子不為空,則將其入棧,並置其左孩子為當前節點 push_stack(stack,pCur); pCur = pCur->pLchild; } else { //如果pCur的左孩子為空,則輸出pCur節點,並將其右孩子設為當前節點,看其是否為空 printf("%c ", pCur->data); pCur = pCur->pRchild; //如果為空,且棧不空,則將棧頂節點出棧,並輸出該節點, //同時將它的右孩子設為當前節點,繼續判斷,直到當前節點不為空 while(!pCur && !is_empty(stack)) { pCur = getTop(stack); printf("%c ",pCur->data); pop_stack(stack,&node_pop); pCur = pCur->pRchild; } } } } /* 後序遍歷的非遞迴實現 */ void beh_traverse(BTree pTree) { PSTACK stack = create_stack(); //建立一個空棧 BTree node_pop; //用來儲存出棧的節點 BTree pCur; //定義指標,指向當前節點 BTree pPre = NULL; //定義指標,指向上一各訪問的節點 //先將樹的根節點入棧 push_stack(stack,pTree); //直到棧空時,結束迴圈 while(!is_empty(stack)) { pCur = getTop(stack); //當前節點置為棧頂節點 if((pCur->pLchild==NULL && pCur->pRchild==NULL) || (pPre!=NULL && (pCur->pLchild==pPre || pCur->pRchild==pPre))) { //如果當前節點沒有左右孩子,或者有左孩子或有孩子,但已經被訪問輸出, //則直接輸出該節點,將其出棧,將其設為上一個訪問的節點 printf("%c ", pCur->data); pop_stack(stack,&node_pop); pPre = pCur; } else { //如果不滿足上面兩種情況,則將其右孩子左孩子依次入棧 if(pCur->pRchild != NULL) push_stack(stack,pCur->pRchild); if(pCur->pLchild != NULL) push_stack(stack,pCur->pLchild); } } }

- 遞迴實現程式碼:

#include<stdio.h>
#include<stdlib.h>
typedef struct BTNode
{
    char data;
    struct BTNode *pLchild;
    struct BTNode *pRchild;
}BTNode, *BTree;

BTree create_tree();
void pre_traverse(BTree);
void in_traverse(BTree);
void beh_traverse(BTree);

int main()
{
    BTree pTree = create_tree();

    printf("遞迴實現前序遍歷結果:");
    pre_traverse(pTree);
    printf("\n");

    printf("遞迴實現中序遍歷結果:");
    in_traverse(pTree);
    printf("\n");

    printf("遞迴實現後序遍歷結果:");
    beh_traverse(pTree);
    printf("\n");

    return 0;
}

BTree create_tree()
{
    BTree pA = (BTree)malloc(sizeof(BTNode));
    BTree pB = (BTree)malloc(sizeof(BTNode));
    BTree pD = (BTree)malloc(sizeof(BTNode));
    BTree pE = (BTree)malloc(sizeof(BTNode));
    BTree pC = (BTree)malloc(sizeof(BTNode));
    BTree pF = (BTree)malloc(sizeof(BTNode));

    pA->data = 'A';
    pB->data = 'B';
    pD->data = 'D';
    pE->data = 'E';
    pC->data = 'C';
    pF->data = 'F';

    pA->pLchild = pB;
    pA->pRchild = pC;
    pB->pLchild = pD;
    pB->pRchild = pE;
    pD->pLchild = pD->pRchild = NULL;
    pE->pLchild = pE->pRchild = NULL;
    pC->pLchild = pF;
    pC->pRchild = NULL;
    pF->pLchild = pF->pRchild = NULL;   

    return pA;
}

/*
前序遍歷的遞迴實現
*/
void pre_traverse(BTree pTree)
{
    if(pTree)
    {
        printf("%c ",pTree->data);
        if(pTree->pLchild)
            pre_traverse(pTree->pLchild);
        if(pTree->pRchild)
            pre_traverse(pTree->pRchild);   
    }
}

/*
中序遍歷的遞迴實現
*/
void in_traverse(BTree pTree)
{
    if(pTree)
    {
        if(pTree->pLchild)
            in_traverse(pTree->pLchild);
        printf("%c ",pTree->data);
        if(pTree->pRchild)
            in_traverse(pTree->pRchild);    
    }
}

/*
後序遍歷的遞迴實現
*/
void beh_traverse(BTree pTree)
{
    if(pTree)
    {
        if(pTree->pLchild)
            beh_traverse(pTree->pLchild);
        if(pTree->pRchild)
            beh_traverse(pTree->pRchild);   
        printf("%c ",pTree->data);
    }
}

相關推薦

方式及通過兩重構(java實現

重構方法參考文章【重構二叉樹(Java實現):https://blog.csdn.net/wangbingcsu/article/details/51372695】 文章目錄 二叉樹類 三種遍歷方式 前序遍歷 中序遍歷 後序遍歷

Java實現演算法

</pre><p></p><p>參考網上一些資料測試整理了一下二叉樹遍歷的Java實現程式碼。</p>二叉樹三種遍歷方式:先序遍歷、中序遍歷、後序遍歷。<p>首先定義二叉樹類:</p>&l

方式的遞迴和迴圈實現

轉載自:http://blog.csdn.net/pi9nc/article/details/13008511 二叉樹是一種非常重要的資料結構,很多其他資料機構都是基於二叉樹的基礎演變過來的。二叉樹有前、中、後三種遍歷方式,因為樹的本身就是用遞迴定義的,因此採用遞迴的方

方式

二叉樹的遍歷,如果是手工畫圖,還可以使用投影法快速得到遍歷序列。 以下圖二叉樹為例,講解投影法快速得到遍歷序列的過程。 (1)          中序遍歷 中序遍歷就像在無風的情況下,太陽直射

方式,先序、中序、後序

二叉樹遍歷方式分為三種:先序,中序和後序。 可以以根節點的位置為參考來記遍歷方式,在第一個為先序,中間為中序,最後為後序; 即:先序: 根左右;中序:左根右;後序:左右根。 借個圖: 每個節點左上角,底部,右上角分別對應先序,中序,後序時的取值點

實現

二叉樹是一種非常重要的資料結構,很多其他資料機構都是基於二叉樹的基礎演變過來的。二叉樹有前、中、後三種遍歷方式,因為樹的本身就是用遞迴定義的,因此採用遞迴的方法實現三種遍歷,不僅程式碼簡潔且容易理解,但其開銷也比較大,而若採用非遞迴方法實現三種遍歷,則要用棧來模擬實現

遞迴及非遞迴實現

二叉樹的三種遍歷方式包括: 前序遍歷中序遍歷後序遍歷 三種遍歷的遞迴方法都非常好實現,而且簡單易懂。非遞迴實現也是通過使用棧來模擬遍歷的過程。順便提一句,能用遞迴做的,基本都能用棧來實現。前序遍歷和中序遍歷的非遞迴寫法相對比較簡單,只需要模擬遍歷過程即可。後序遍歷非遞迴寫

【圖解資料結構】 一組動畫徹底理解

二叉樹的遍歷是指從根結點出發,按照某種次序依次訪問二叉樹中所有結點,使得每個結點被訪問一次且僅被訪問一次。 在二叉樹的遍歷中存在三種較為常用的遍歷方式:前序遍歷、中序遍歷、後序遍歷。接下來我將嘗試著用三組動畫向讀者詳細的介紹這三種遍歷方式的邏輯思路,希望讓讀者看到任何的二叉樹都能在腦海中快速的勾勒出動畫。

(Java)

以前學資料結構的時候是用C學的,現在重新複習一下資料結構裡用的比較多的二叉樹,用Java實現。好啦,廢話不多說啦!! 我們知道二叉樹有三種遍歷方式:前序(根左右)、中序(左根右)、後序(左右根)。每種遍歷方式其實就是一個遞迴呼叫。 步驟: 1、將陣列中的元素賦值給二叉樹(通

的非遞迴思路(JAVASCRIPT)

二叉樹在圖論中是這樣定義的:二叉樹是一個連通的無環圖,並且每一個頂點的度不大於3。有根二叉樹還要滿足根結點的度不大於2。有了根結點之後,每個頂點定義了唯一的父結點,和最多2個子結點。然而,沒有足夠的資訊來區分左結點和右結點。如果不考慮連通性,允許圖中有多個連通分

非遞迴演算法

1.先序遍歷非遞迴演算法 #define maxsize 100 typedef struct {     Bitree Elem[maxsize];     int top; } SqStack; void PreOrderUnrec(Bitree t) {     SqStack s;     Stack

方式之間的轉換

寫在前面 二叉樹的遍歷方式,基本可以歸結為四種:前序遍歷、中序遍歷、後序遍歷、層次遍歷 先序遍歷順序:根,左兒子,右兒子 中序遍歷順序:左兒子,根,右兒子 後序遍歷順序:左兒子,右兒子,根 層次遍歷順序:根據每一層的順序,由左向右依次輸出 遍歷順序及轉換  &n

方式的速度差異

同學阿里三面面試官的一道面試題是:二叉樹每個節點都儲存一個整數,想要求所有節點數值之和,哪種遍歷方式最快? 首先定義二叉樹 struct Tree { int val; Tree *left; Tree *right; Tre

C++實現方式

- 非遞迴實現程式碼: #include<stdio.h> #include<stdlib.h> #include"data_structure.h" //建立一棵二叉樹 BTree create_tree() { BTree

C語言實現的各種及求解深度

#include<stdio.h> #include<malloc.h> #define MAXSIZE 100 typedef char dataType; //二叉樹結構 typedef struct bnode{ dataType data; struct bnode *lC

Python實現"的層次||"的一方法

給定一棵二叉樹,返回從上到下按層級順序遍歷結點的值(例如,從葉子節點的層級到根結點的層級) 例如: 二叉樹[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它從下到上按層級順序遍歷的

利用鏈式佇列實現的層次C語言)

規則: 判斷樹是否為空,為空則返回; 若不空,從樹的第一層。也就是根節點開始訪問。 從上而下逐層遍歷, 在同一層中,按從左到右的順序對節點逐個訪問。 #include<stdio.h> #include<stdlib.h> t

3演算法遞迴與非遞迴實現詳解

一, 二叉樹先序遍歷的實現     遞迴實現 void PreOrderTraverse(BiTree T) { if( T ) { VisitF(T->data);//訪問根節點 PreOrderTra

Python實現的層次及按層輸出的兩方法

二叉樹的層次遍歷 二叉樹的層次遍歷即從上往下、從左至右依次列印樹的節點。 其思路就是將二叉樹的節點加入佇列,出隊的同時將其非空左右孩子依次入隊,出隊到佇列為空即完成遍歷。 # -*- coding:utf-8 -*- # class TreeNode: #

【資料結構週週練】012 利用佇列和非遞迴演算法實現的層次

一、前言 二叉樹的遍歷是比較多樣化的遍歷,有很多種遍歷方式,先序遍歷,中序遍歷,後序遍歷,層次遍歷等等。本次給大家講的是層次遍歷,為了方便,我將題目中的資料改為編號,從左往右,從上往下依次遍歷。方便大家看到結果。 二、題目 將下圖用二叉樹存入,並通過層次遍歷方式,自上而下,從左往右對