C語言非遞迴實現二叉樹的先序、中序、後序遍曆,遞迴二叉樹
#include <stdio.h> #include <stdlib.h> #define INIT_STACK_SIZE 100 #define STACKINCREMENT 10 //*****二叉樹的二叉鏈表格儲存體結構*****// typedef struct BiNode { char data; struct BiNode *lchild, *rchild; int visitcount; //訪問次數(後序遍曆會用到) }BiNode, *BiTree; typedef struct { BiNode **base; BiNode **top; int stacksize; }SqStack; //*****初始化棧*****// void InitStack(SqStack &S) { if (!(S.base = (BiNode **)malloc(sizeof(BiTree) * INIT_STACK_SIZE))) { return; } S.top = S.base; S.stacksize = INIT_STACK_SIZE; return; } //*****元素進棧*****// void Push(SqStack &S, BiNode *e) { if (S.top - S.base >= S.stacksize) { if (!(S.base = (BiNode **)realloc(S.base, sizeof(BiTree) * (STACKINCREMENT + S.stacksize)))) { return; } S.stacksize += STACKINCREMENT; } *S.top++ = e; return; } //*****元素出棧*****// void Pop(SqStack &S, BiNode **e) { if (S.base == S.top) { return; } *e = *--S.top; return; } //*****取棧頂元素*****// int GetTop(SqStack S, BiNode **e) { if (S.base == S.top) { return 0; } *e = *(S.top - 1); return 1; } //*****判斷棧是否為空白*****// int StackEmpty(SqStack S) { if (S.top == S.base) return 1; else return 0; } //*****按先序次序輸入二叉樹中結點的值(一個字元),空白字元表示空樹構造二叉鏈表表示的二叉樹T*****// void CreateBiTree(BiTree &T) { char ch; scanf("%c", &ch); if(ch == ' ') { T = NULL; } else { if(!(T = (BiNode *)malloc(sizeof(BiNode)))) { return; } T->data = ch; //產生根結點 CreateBiTree(T->lchild); //構造左子樹 CreateBiTree(T->rchild); //構造右子樹 } return; } //*****先序遍曆二叉樹方法1*****// void PreorderTraverse_1(BiTree T) { BiTree p; SqStack S; InitStack(S); Push(S, T); //根指標進棧 while(!StackEmpty(S)) { while(GetTop(S, &p) && p) { printf("%c ", p->data); Push(S, p->lchild); } Pop(S, &p); //null 指標退棧 if(!StackEmpty(S)) { Pop(S, &p); //根結點出棧 Push(S,p->rchild); //右孩子進棧 } } return; } //*****先序遍曆二叉樹方法2*****// void PreorderTraverse_2(BiTree T) { BiTree p = T; SqStack S; InitStack(S); while (p || !StackEmpty(S)) { if (p) { printf("%c ", p->data); Push(S,p); p = p->lchild; } else { Pop(S, &p); p = p->rchild; } } } //*****中序遍曆二叉樹方法1*****// void InOrderTraverse_1(BiTree T) { SqStack S; BiTree p; InitStack(S); Push(S,T); while (!StackEmpty(S)) { while (GetTop(S,&p) && p) { Push(S,p->lchild); //向左走到盡頭 } Pop(S,&p); //null 指標退棧 if (!StackEmpty(S)) { Pop(S,&p); printf("%c ", p->data); Push(S,p->rchild); } } return; } //*****中序遍曆二叉樹方法2*****// void InOrderTraverse_2(BiTree T) { BiTree p = T; SqStack S; InitStack(S); while (p || !StackEmpty(S)) { if (p) { Push(S,p); p = p->lchild; } else { Pop(S, &p); printf("%c ", p->data); p = p->rchild; } } return; } //*****後序遍曆二叉樹*****// void PostOrderTraverse(BiTree T) { SqStack S; BiTree p = T; InitStack(S); while (p || !StackEmpty(S)) { if(p) { if (p->visitcount != 2) { p->visitcount = 1; Push(S, p); } p = p->lchild; } else { Pop(S, &p); if(p->visitcount == 2) { printf("%c ", p->data); } else { p->visitcount++; Push(S, p); } p = p->rchild; } } return; } int main(void) { BiTree T; printf("請按先序次序輸入二叉樹中結點的值(字元),空白字元表示空樹:\n"); CreateBiTree(T); printf("先序遍曆方法1結果為:"); PreorderTraverse_1(T); printf("\n\n"); printf("先序遍曆方法2結果為:"); PreorderTraverse_2(T); printf("\n\n"); printf("中序遍曆方法1結果為:"); InOrderTraverse_1(T); printf("\n\n"); printf("中序遍曆方法2結果為:"); InOrderTraverse_2(T); printf("\n\n"); printf("後序遍曆結果為:"); PostOrderTraverse(T); printf("\n\n"); return 0; }
以如下二叉樹為例,給出按先序次序輸入二叉樹中結點的值(字元),從而按照本文給出的演算法構造二叉樹。
輸入字元的順序是:-+a空格空格*b空格空格-c空格空格d空格空格/e空格空格f空格空格,即可驗證本文給出的遍曆演算法。
建立一棵二叉樹,要分別用遞迴與非遞迴方法實現二叉樹的先序、中序與後序遍曆
我們的資料結構實驗也是這題,需要我把我的實驗報告給你參考下麼!
我這裡就只發這部分的代碼。
Status PreOrderTraverse(BiTree T)
{
//先序遍曆二叉樹T的遞迴演算法
if (T)
{
printf("%d ",T->data);
if(T->lchild) PreOrderTraverse(T->lchild);
if(T->rchild) PreOrderTraverse(T->rchild);
return FALSE;
}
elsereturn OK;
}
Status PreOrder(BiTree T)
{
//先序遍曆二叉樹T的非遞迴演算法
while(!(T==NULL&&top==NULL))
{
if(T)
{
printf("%d ",T->data);
push(T);
T=T->lchild;
}
else
{
T=(BiTree)pop();
T=T->rchild;
}
}
}
Status InOrderTraverse(BiTree T)
{
//中序遍曆二叉樹T的遞迴演算法
if (T)
{
if (T->lchild) InOrderTraverse(T->lchild);
printf("%d ",T->data);
if (T->rchild) InOrderTraverse(T->rchild);
return FALSE;
}
else return OK;
}
Status InOrder(BiTree T)
{
//中序遍曆二叉樹T的非遞迴演算法
while(!(T==NULL&&top==NULL))
{
while(T)
{
push(T);
T=T->lchild;
}
T=(BiTree)pop();
printf("%d ",T->data);
T=T->rchild;
}
}
Status PostOrderTraverse(BiTree T)
{
//後序遍曆二叉樹T的遞迴演算法
if (T)
{
if (T->lchild) PostOrderTraverse(T->lchild);
if (T->rchild) PostOrderTraverse(T->rchild);
printf("%d ",T->data);
return FALSE;
}
else return OK;
}
Status PostOrder(BiTree T)
{
//後序遍曆二叉樹T的遞迴演算法
unsigned sign;//記錄結點從棧中彈出的次數
while(!(T==NULL&&top==NULL))
{
if(T)
{
push(T);//第一次遇到結點T時壓入其指標
push(1);//置標誌為1
T=T->lchild;
}
else
{......餘下全文>>
資料結構實驗(用C語言)建立一棵二叉樹,並用遞迴或者非遞迴的演算法分別用先序中序與後序遍曆、
#define LEN sizeof(struct tree)
#define NULL 0
#include<stdio.h>
#include<malloc.h>
struct tree
{
char data;
struct tree *lchild,*rchild;
};
//建立二叉樹
struct tree *creat()
{
char c;
struct tree *t;
c=getchar();
if(c==' ')
t=NULL;
else
{
t=(struct tree*)malloc(LEN);
t->data=c;
t->lchild=creat();
t->rchild=creat();
}
return t;
}
//前序走訪
void Preprint(struct tree*t)
{
if(t!=NULL)
{
printf("%c->",t->data);
Preprint(t->lchild);
Preprint(t->rchild);
}
}
//中序遍曆
void Inprint(struct tree*t)
{
if(t!=NULL)
{
Inprint(t->lchild);
printf("%c->",t->data);
Inprint(t->rchild);
}
}
//後序遍曆
void Postprint(struct tree*t)
{
if(t!=NULL)
{
Postprint(t->lchild);
Postprint(t->rchild);
printf("%c->",t->data);
}
}
main()
{
struct tree *t;
printf("Please input tree in order:\n");
t=creat();
printf("The result of Preorder traversal is\n");
Preprint(t);
printf("^\nThe result of Inorder traversal is\n");
Inprint(t);
printf("^\nThe result of Postorder traversal is\n");
Postprint(t);
printf("^\n");
getch();
}...餘下全文>>