當前位置:才華齋>計算機>C語言>

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

C語言 閱讀(7.05K)

計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”。本文特意為大家收集整理了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(==)

{

return TRUE;

}

else

{

return FALSE;

}

}

int StackLength(SqStack S){

return ksize;

}

Status GetTop(SqStack S,SElemType *e){

if( == )

{

return FALSE;

}

else

{

*e = *(-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;

}