<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            C語言

            c語言版本二叉樹基本操作示例

            時間:2025-01-21 09:38:26 C語言 我要投稿
            • 相關推薦

            c語言版本二叉樹基本操作示例

              在計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”。本文特意為大家收集整理了c語言版本二叉樹基本操作示例,希望大家喜歡!

              復制代碼 代碼如下:

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

              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("%dn", 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 == '')

              {

              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;

              }


            【c語言版本二叉樹基本操作示例】相關文章:

            C語言基本語法示例08-15

            C語言對棧的實現基本操作介紹01-15

            c語言操作文本的基本使用方法03-20

            c語言操作文本基本使用方法04-10

            Go與C語言的操作02-15

            C語言的底層操作06-03

            C語言位操作是04-22

            C語言的特點及版本有哪些05-08

            C語言的基本要點04-13

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院