1. 程式人生 > >樹 - 二叉樹的遍歷和初始化

樹 - 二叉樹的遍歷和初始化

二叉樹

                 4
               /   \
             1      7
           /  \   /   \
          0   2  5    8
               \  \    \
                3  6    9
二叉樹的前序、中序、後序遍歷

    按訪問根結點的順序區分:

    前序:NLR(根結點-左子樹-右子樹)    4 1 0 2 3 7 5 6 8 9

    中序:LNR(左子樹-根結點-右子樹)    0 1 2 3 4 5 6 7 8 9

    後續:LRN(左子樹-右子樹-根結點)    0 3 2 1 6 5 9 8 7 4

    子樹也是按照同樣的遍歷順序,所以是一個遞迴過程

typedef struct Tree{
    int val;
    Tree *left;
    Tree *right;
    //Tree(int v):val(v){}
}*P_Tree;

//二叉樹遍歷 -- 前序遍歷
int preVisitBiTree(P_Tree node){
    if(NULL == node){
        return -1;
    }
    cout << node->val << " ";
    preVisitBiTree(node->left);
    preVisitBiTree(node->right);
    return 0;
}

//二叉樹遍歷 -- 後序遍歷
int behindVisitBiTree(P_Tree node){
    if(NULL == node){
        return -1;
    }
    behindVisitBiTree(node->left);
    behindVisitBiTree(node->right);
    cout << node->val << " ";
    return 0;
}

//二叉樹遍歷 -- 中序遍歷
int midVisitBiTree(P_Tree node){
    if(NULL == node){
        return -1;
    }
    midVisitBiTree(node->left);
    cout << node->val << " ";
    midVisitBiTree(node->right);
    return 0;
}

二叉樹的層序遍歷

    從上到下,從左到右遍歷     4 1 7 0 2 5 8 3 6 9

    利用佇列實現(Q)

    佇列的實現參考:佇列 - 佇列的建立和基本操作

> 根結點從列隊尾push入列隊Q
while(Q不為空){
	從列隊頭pop出一個結點t
	訪問結點t
	if(t的左子樹不為空){
		t的左子樹從列隊尾push入列隊Q
	}
	if(t的右子樹不為空){
		t的右子樹從列隊尾push入列隊Q
	}
}       //是一個迴圈過程
//二叉樹層序遍歷
void levelVisit(P_Tree tree){
    if(!tree){
        return;
    }
    Queue q;
    q=createQueue();
    P_Tree t;
    t=tree;
    push(t,q);
    while(!isEmpty(q)){
        t=pop(q);
        cout << t->val  << " ";
        if(t->left){
            push(t->left,q);
        }
        if(t->right){
            push(t->right,q);
        }
    }
}

===========================================================

二叉樹的初始化(構造、建立)

//以前序遍歷的方式構造一顆二叉樹   //遞迴構造

//空結點用標記字元(#)表示

// 4 1 0 # # 2 # 3 # # 7 5 # 6 # # 8 # 9 # #

int makeBiTree(int **nv,P_Tree *node){
    if(**nv == '#') {
        *node=NULL;
        return -1;
    }
    *node=(P_Tree)malloc(sizeof(Tree));
    (*node)->val=**nv;
    (*nv)++;
    makeBiTree(&(*nv),&(*node)->left);
    (*nv)++;
    makeBiTree(&(*nv),&(*node)->right);
    return 0;
}

int main(){
    int arr[21]={4, 1, 0, '#', '#', 2, '#', 3, '#', '#', 7, 5, '#', 6, '#', '#', 8, '#', 9, '#', '#'};
    P_Tree rootNode = NULL;
    int *p=arr; //arr與&arr的區別參考備註
    makeBiTree(&p,&rootNode); //指標的指標
    return 0;
}

備註:

int arr[2]={1,2};  // ? arr 與 &arr

//測試arr與&arr
#include <iostream>
int main(){
        int arr[2]={1,2};
        std::cout << arr << " : " << *(arr) << std::endl << "  ";
        std::cout << arr+1 << " : " << *(arr+1) << std::endl;
        std::cout << &arr << " : " << *(&arr) << std::endl << "  ";
        std::cout << &arr+1 << " : " << *(&arr+1) << std::endl;
        return 0;
}

//測試arr與&arr
#include <iostream>
int main(){
        int arr[2]={1,2};
        std::cout << arr << " : " << *(arr) << std::endl << "  ";
        std::cout << arr+1 << " : " << *(arr+1) << std::endl;
        std::cout << &arr << " : " << *(&arr) << std::endl << "  ";
        std::cout << &arr+1 << " : " << *(&arr+1) << std::endl;

        int *p=arr;
        int *pp=&arr;  //11行
        return 0;
}