亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

c語言版本二叉樹基本操作示例(先序 遞歸 非遞歸)

2020-01-26 15:41:23
字體:
來源:轉載
供稿:網友

復制代碼 代碼如下:

請按先序遍歷輸入二叉樹元素(每個結點一個字符,空結點為'='):
ABD==E==CF==G==

先序遞歸遍歷:
A B D E C F G
中序遞歸遍歷:
D B E A F C G
后序遞歸遍歷:
D E B F G C A
層序遞歸遍歷:
ABCDEFG
先序非遞歸遍歷:
A B D E C F G
中序非遞歸遍歷:
D B E A F C G
后序非遞歸遍歷:
D E B F G C A
深度:
請按任意鍵繼續. . .

復制代碼 代碼如下:

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

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

typedef int Status;

typedef char ElemType;
typedef struct BTNode
{
    ElemType data;
    struct BTNode *leftChild;
    struct BTNode *rightChild;
}BTNode, *BinTree;

typedef BinTree SElemType;

typedef struct{//棧結構定義
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;

BinTree CreateBinTree(BinTree T);
Status Visit(ElemType e);
Status Depth(BinTree T);
Status PreOrderRecursionTraverse(BinTree T, Status (*Visit)(ElemType e));
Status InOrderRecursionTraverse(BinTree T, Status (*Visit)(ElemType e));
Status PostOrderRecursionTraverse(BinTree T, Status (*Visit)(ElemType e));
Status LevelOrderRecursionTraverse(BinTree T, Status (*Visit)(ElemType e));

//定義棧的相關操作
Status InitStack(SqStack *S);
Status DestroyStack(SqStack *S);
Status ClearStack(SqStack *S);
Status StackEmpty(SqStack S);
int StackLength(SqStack S);
Status GetTop(SqStack S,SElemType *e);
Status Push(SqStack *S,SElemType e);
Status Pop(SqStack *S,SElemType *e);
Status StackTraverse(const SqStack *S);

Status PreOrderNoneRecursionTraverse(BinTree T, Status (*Visit)(ElemType e));
Status InOrderNoneRecursionTraverse(BinTree T, Status (*Visit)(ElemType e));
Status PostOrderNoneRecursionTraverse(BinTree T, Status (*Visit)(ElemType e));

int main()
{
    int depth;
    BinTree Tree = NULL;
    Status(*visit)(ElemType e) = Visit; 
    printf_s("請按先序遍歷輸入二叉樹元素(每個結點一個字符,空結點為'='):/n"); 
    Tree = CreateBinTree(Tree);

    printf_s("/n先序遞歸遍歷:/n");
    PreOrderRecursionTraverse(Tree,visit);
    printf_s("/n中序遞歸遍歷:/n");
    InOrderRecursionTraverse(Tree,visit);
    printf_s("/n后序遞歸遍歷:/n");
    PostOrderRecursionTraverse(Tree,visit);
    printf_s("/n層序遞歸遍歷:/n");
    LevelOrderRecursionTraverse(Tree,visit);

    printf_s("/n先序非遞歸遍歷:/n");
    PreOrderNoneRecursionTraverse(Tree,visit);
    printf_s("/n中序非遞歸遍歷:/n");
    InOrderNoneRecursionTraverse(Tree,visit);
    printf_s("/n后序非遞歸遍歷:/n");
    PostOrderNoneRecursionTraverse(Tree,visit);

    printf_s("/n深度:/n");
    depth = Depth(Tree);
    printf_s("%d/n", depth);
    system("pause");
    return 0;
}

//創建二叉樹
BinTree CreateBinTree(BinTree T)
{
    char ch;
    scanf_s("%c", &ch);
    if (ch == '=')
    {
        T = NULL;
    }
    else
    {
        if (!(T=(BTNode *) malloc(sizeof(BTNode))))
        {
            exit(OVERFLOW);
        }
        T->data = ch;    //生成根結點
        T->leftChild = CreateBinTree(T->leftChild);
        T->rightChild = CreateBinTree(T->rightChild);
    }
    return T;
}

//訪問二叉樹
Status Visit(ElemType e)
{
    if (e == '/0')
    {
        return ERROR;
    }
    else
    {
        printf_s("%c ", e);
    }
    return OK;
}

//先序遍歷遞歸算法
Status PreOrderRecursionTraverse(BinTree T, Status (*Visit)(ElemType e))
{
    if (T)
    {
        if (!Visit(T->data))
        {
            return ERROR;
        }
        PreOrderRecursionTraverse(T->leftChild, Visit);
        PreOrderRecursionTraverse(T->rightChild, Visit);
    }
    return OK;
}

//中序遍歷遞歸算法
Status InOrderRecursionTraverse(BinTree T, Status (*Visit)(ElemType e))
{
    if (T)
    {
        InOrderRecursionTraverse(T->leftChild, Visit);
        if (!Visit(T->data))
        {
            return ERROR;
        }
        InOrderRecursionTraverse(T->rightChild, Visit);
    }
    return OK;
}

//后序遍歷遞歸算法
Status PostOrderRecursionTraverse(BinTree T, Status (*Visit)(ElemType e))
{
    if (T)
    {
        PostOrderRecursionTraverse(T->leftChild, Visit);
        PostOrderRecursionTraverse(T->rightChild, Visit);
        if (!Visit(T->data))
        {
            return ERROR;
        }
    }
    return OK;
}

//層序遍歷遞歸算法
Status LevelOrderRecursionTraverse(BinTree T, Status (*Visit)(ElemType e))
{
    if (T)
    {
        BTNode *Q[100];//假設不溢出
        int front = -1,rear = -1;
        if (T)
        {
            Q[++rear] = T;
            printf_s("%c", T->data);
            while (front != rear)
            {
                BTNode *p;
                if (!(p = (BTNode *)malloc(sizeof(BTNode))))
                {
                    exit(OVERFLOW);
                }
                p = Q[++front];
                if (p->leftChild)
                {
                    Q[++rear] = p->leftChild;
                    printf("%c",p->leftChild->data);
                }
                if (p->rightChild)
                {
                    Q[++rear] = p->rightChild;
                    printf("%c",p->rightChild->data);
                }
            }
        }
    }
    return OK;
}

Status Depth(BinTree T)
{
    int a,b;
    if (!T)
    {
        return ERROR;
    }
    else
    {
        a = Depth(T->leftChild) + 1;
        b = Depth(T->rightChild) + 1;
        return a > b ? a : b;
    }
}

//先序遍歷非遞歸算法
Status PreOrderNoneRecursionTraverse(BinTree T, Status (*Visit)(ElemType e))
{
    SqStack S;
    SElemType p;

    InitStack(&S);
    Push(&S, T);

    while (!StackEmpty(S))
    {
        Pop(&S, &p);
        if (!Visit(p->data))
        {
            return ERROR;
        }
        if (p->leftChild)
        {
            Push(&S, p->rightChild);
        }
        if (p->rightChild)
        {
            Push(&S, p->leftChild);
        }
    }
    DestroyStack(&S);
    return OK;
}

//中序遍歷非遞歸算法
Status InOrderNoneRecursionTraverse(BinTree T, Status (*Visit)(ElemType e))
{
    SqStack S;
    SElemType p;

    InitStack(&S);
    Push(&S, T);
    while (!StackEmpty(S))
    {
        while (GetTop(S,&p) && p)
        {
            Push(&S, p->leftChild);
        }
        Pop(&S, &p);
        if (!StackEmpty(S))
        {
            Pop(&S, &p);
            if (!Visit(p->data))
            {
                return ERROR;
            }
            Push(&S, p->rightChild);
        }
    }
    DestroyStack(&S);
    return OK;
}

//后序便利非遞歸算法
Status PostOrderNoneRecursionTraverse(BinTree T, Status (*Visit)(ElemType e))
{
    SqStack S;
    SElemType p, q;
    InitStack(&S);
    Push(&S,T);
    while(!StackEmpty(S))
    {
        while(GetTop(S,&p)&&p&&(p->leftChild||p->rightChild))
        {
            Push(&S,p->rightChild);
            Push(&S,p->leftChild);
        }
        if(!StackEmpty(S)){
            Pop(&S,&p);
            if (p)
            {
                if(!Visit(p->data))
                {
                    return ERROR;
                }
            }
            else
            {
                Pop(&S,&p);
                if(!Visit(p->data))
                {
                    return ERROR;
                }
            }           
            while (GetTop(S,&q)&&q&&p==q->rightChild)
            {
                Pop(&S,&p);
                if(!Visit(p->data))
                {
                    return ERROR;
                }
                GetTop(S,&q);
            }
        }
    }
    DestroyStack(&S);
    return OK;
}

//-----------棧的相關操作--------------//
Status InitStack(SqStack *S){
    S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if(!S->base)
    {
        exit(0);
    }
    S->top = S->base;
    S->stacksize = STACK_INIT_SIZE;
    return OK;
}

Status DestroyStack(SqStack *S){
    if(!S)
    {
        exit(0);
    }
    free(S->base);
    return OK;
}

Status ClearStack(SqStack *S){
    if(!S)
    {
        return FALSE;
    }
    S->top = S->base;
    return OK;
}

Status StackEmpty(SqStack S){
    if(S.top==S.base)
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    }
}

int StackLength(SqStack S){
    return S.stacksize;
}

Status GetTop(SqStack S,SElemType *e){
    if(S.top == S.base)
    {
        return FALSE;
    }
    else
    {
        *e = *(S.top-1);
        return OK;
    }
}

Status Push(SqStack *S,SElemType e){
    if(S->top-S->base>=S->stacksize)
    {
        S->base = (SElemType *)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!S->base)
        {
            exit(0);
        }
        S->top = S->base+S->stacksize;
        S->stacksize += STACKINCREMENT;
    }
    *S->top++ = e;
    return OK;
}

Status Pop(SqStack *S,SElemType *e){
    if(S->top==S->base)
    {
        return ERROR;
    }
    *e = *(--S->top);
    return OK;
}





 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲性av网站| 亚洲成人黄色网址| 亚洲人成电影在线| 欧美伊久线香蕉线新在线| 日韩在线观看精品| 国产亚洲欧洲高清| 欧美激情欧美激情在线五月| 欧美黄色三级网站| 亚洲福利视频专区| 中文字幕日韩在线视频| 欧美日韩性视频在线| 欧美亚洲国产另类| 色综合男人天堂| 亚洲第一精品久久忘忧草社区| 日韩电影在线观看中文字幕| 久久亚洲欧美日韩精品专区| 亚洲电影免费观看高清完整版| 亚洲第一区在线观看| 久久久久久久久国产| 欧美怡红院视频一区二区三区| 成人免费网视频| 色综合视频网站| 17婷婷久久www| 日韩性生活视频| 国产亚洲视频中文字幕视频| 69视频在线免费观看| 欧美在线一区二区三区四| 国产精品爽爽ⅴa在线观看| 国产精品极品美女粉嫩高清在线| 日韩高清a**址| 黑人巨大精品欧美一区免费视频| 成人福利在线观看| 成人免费看吃奶视频网站| 亚洲国产日韩欧美在线图片| 亚洲日本欧美中文幕| 青草青草久热精品视频在线观看| 日韩欧美在线视频免费观看| 欧美成人精品影院| 亚洲综合在线小说| 国产一区二区欧美日韩| 国产z一区二区三区| 国产日韩在线精品av| 欧美性生交xxxxx久久久| 久久久电影免费观看完整版| 欧美老女人性生活| 久久精品色欧美aⅴ一区二区| 亚洲第一二三四五区| 97在线看免费观看视频在线观看| 狠狠操狠狠色综合网| 96pao国产成视频永久免费| 久久噜噜噜精品国产亚洲综合| 久久视频在线播放| 日韩在线观看免费高清完整版| 日韩电影大全免费观看2023年上| 久久久久久亚洲精品不卡| 国产精品嫩草影院一区二区| 91天堂在线观看| 不卡毛片在线看| 国产日韩欧美黄色| 国产精品av免费在线观看| 色哟哟入口国产精品| 欧美大片va欧美在线播放| 久久久久久久影视| 久99九色视频在线观看| 久热精品视频在线观看一区| 国产精品视频在线观看| 97视频在线免费观看| 欧美国产日韩一区二区| 中文字幕国产精品| 国产视频精品在线| 亚洲欧美制服另类日韩| 伊人久久免费视频| 国产99久久精品一区二区永久免费| 国产69精品久久久久9999| 国产在线观看不卡| 97精品国产aⅴ7777| 日韩成人免费视频| 日韩在线激情视频| 亚洲乱码一区二区| 亚洲国产精品电影在线观看| 日韩中文字幕免费看| 国内精品400部情侣激情| 亚洲一区二区三区成人在线视频精品| 久久人人爽人人爽人人片亚洲| 欧美性感美女h网站在线观看免费| 国产在线视频2019最新视频| 色无极影院亚洲| 97视频人免费观看| 日韩中文字幕网| 乱亲女秽乱长久久久| 成人做爰www免费看视频网站| xx视频.9999.com| 欧美另类老肥妇| 日韩中文字幕第一页| 91av视频在线| 成人黄色中文字幕| 国产亚洲精品综合一区91| 日韩在线国产精品| 国产精品爱久久久久久久| 97在线视频免费观看| 日韩美女免费视频| 久久久99久久精品女同性| 午夜精品在线观看| 欧美精品激情blacked18| 成人黄色免费片| 日韩麻豆第一页| 欧美成人一区二区三区电影| www.国产精品一二区| 亚洲国产另类 国产精品国产免费| 国产成人在线亚洲欧美| 久久久免费在线观看| 欧美极品少妇与黑人| 日产精品久久久一区二区福利| 久久久噜噜噜久久| 久久久久在线观看| 国产精彩精品视频| 亚洲精品白浆高清久久久久久| 亚洲最大av网站| 国产精品成人免费电影| 国产精品www| 日韩av日韩在线观看| 中文字幕亚洲欧美日韩高清| 国产精品一区二区三区免费视频| 亚洲欧美中文日韩在线v日本| 亚洲老板91色精品久久| 夜夜狂射影院欧美极品| 精品视频偷偷看在线观看| 日韩性xxxx爱| 九九热这里只有精品6| 北条麻妃在线一区二区| 国产成人精品亚洲精品| 日韩在线观看电影| 亚洲在线视频福利| 国产偷国产偷亚洲清高网站| 国产在线久久久| 一区二区三区国产视频| 欧美激情亚洲视频| 欧美一性一乱一交一视频| 国产精品无码专区在线观看| 亚洲男人的天堂网站| 久热精品视频在线| 欧美乱妇40p| 欧美日韩一区二区免费在线观看| 欧美日韩国产精品一区二区不卡中文| 日韩毛片在线看| 国产成人精品免高潮费视频| 中文字幕亚洲情99在线| 久久精品人人做人人爽| 国产91av在线| 亚洲a区在线视频| 毛片精品免费在线观看| 国产精品久久久久久av福利软件| 久久艹在线视频| 川上优av一区二区线观看| 欧美午夜精品在线| 欧美亚洲在线观看| 国产精品久久久亚洲| 欧美日韩人人澡狠狠躁视频| 国产ts一区二区| 国产91精品久久久| 久久久久中文字幕| 欧美激情视频给我| 亚洲国产精品va在线看黑人| 久久伊人免费视频|