c語言的二叉樹的建立

被遺棄的庸才發表於2017-05-04
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define M 100//定義最大的節點數
//建立二叉樹的型別
typedef struct TNode{
    char data;//資料型別
    struct TNode *left,*right;
}*BinTree;//定義指標變數
//輸入字串返回二叉連結串列
BinTree cearteTree(char *str){//返回的是一個二叉連結串列
    BinTree s[M],b=NULL,p;//初始棧,初始化root指標,定義一個用來建立的指標
    int top=-1,i=0,flag=1;//原始棧為空,定義標誌位flag=1
    while(str[i]!='\0'){//字串遍歷完成
        if(str[i]!='#'){
            p=(BinTree)malloc(sizeof ( struct TNode));//如果不是#申請儲存空間
            p->data=str[i];//為當前的資料賦值
            p->left=p->right=NULL;//初始話左右指標
            if(b==NULL){//判斷是否有雙親節點
                b=p;
            }else{
                switch(flag){
                    case 1:s[top]->left=p;break;//使雙親節點的左指標指向當前的指標
                    case 2:s[top]->right=p;top--;break;//使雙親節點的左指標指向當前的指標,雙親節點出戰
                    }
            }
            top++;//指標後移
            s[top]=p;//將當前的值入棧
            flag=1;//重新整理當前的flag
        }else{
        flag=2;//標記為右指標
        if(str[i-1]=='#'){//若上一個是#代表左右都是空
            top--;//指標後移
        }
        }
        i++;//字元元素後移
    }
    return b;//最後返回根節點b
}


//先序遍歷,底層為遞迴演算法
void preorder(BinTree b){
    if(b==NULL){
        return ;
    }else{
    printf("%-5c",b->data);//輸出對應的結果
    preorder(b->left);//向左遞迴查詢
    preorder(b->right);//向右遞迴查詢
    }
}
//中序遍歷,底層為遞迴演算法
void center(BinTree b){
    if(b==NULL){
        return ;
    }else{
    preorder(b->left);//向左遞迴查詢
    printf("%-5c",b->data);//輸出對應的結果
    preorder(b->right);//向右遞迴查詢
    }
}
//後序遍歷,底層為遞迴演算法
void finall(BinTree b){
    if(b==NULL){
        return ;
    }else{
    preorder(b->left);//向左遞迴查詢
    preorder(b->right);//向右遞迴查詢
    printf("%-5c",b->data);//輸出對應的結果
    }
}
int main(){
    char s[M];//定義一個最大大小的字元陣列
    BinTree b;//定義一個二叉樹的頭指標b
    gets(s);//得到輸入的字串
    b=cearteTree(s);//建立二叉樹
    preorder(b);//先序遍歷
        printf("\n");
    center(b);//中序遍歷
        printf("\n");
    finall(b);//後序遍歷
        printf("\n");
    return 0;
}

相關文章