擴充套件的先序遍歷序列建立以二叉連結串列方式儲存的二叉樹,後序遍歷
阿新 • • 發佈:2019-02-04
1. 請根據使用者輸入的“擴充套件的先序遍歷序列”(用小圓點表示空子樹),建立以二叉連結串列方式儲存的二叉樹,然後寫出後序遍歷該二叉樹的非遞迴演算法,並將對應的程式除錯執行通過。
#include<stdio.h>
#include<stdlib.h>
#define FALSE 0
#define TRUE 1
#define ERROR 0
#define OK 1
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int status;
//二叉樹的二叉連結串列儲存表示
typedef struct BiTNode{
struct BiTNode *lchild, *rchild;
char data;
}BiTNode, * BiTree;
//順序棧的儲存表示
typedef struct SqStack{
int stacksize;
BiTree *base;
BiTree *top;
}SqStack;
status InitStack(SqStack &S)
{
S.base = (BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTNode));
if (!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize =STACK_INIT_SIZE;
return OK;
}
status GetTop(SqStack &S,BiTree &p)
{
//若棧不空,則刪除S的棧頂元素,用p返回其值
if (!S.base) exit(OVERFLOW);
if (S.base==S.top)return ERROR;
p = *(S.top-1);
return OK;
}
status Push(SqStack &S, BiTree T)
{
//插入元素 T 為新的棧頂元素
if (S.top - S.base >= S.stacksize)
{
S.base = (BiTree*)realloc(S.base, (S.stacksize + STACKINCREMENT)*sizeof(BiTNode));
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
if (!S.base) exit(OVERFLOW);
(*S.top )= T;
S.top++;
return OK;
}
status Pop(SqStack &S, BiTree &p)
{
//若棧不空,則刪除棧頂元素,並用p返回其值
if (!S.base) exit(OVERFLOW);
if (S.base == S.top)return ERROR;
--S.top;
p =* S.top;
return OK;
}
status StackEmpty(SqStack S)
{
//若棧為空,返回TRUE;否則,返回FALSE
if (!S.base) exit(OVERFLOW);
if (S.base == S.top)return TRUE;
else return FALSE;
}
status CreateBiTree(BiTree &T)
{
//擴充套件的先序遍歷序列(用小圓點表示空子樹),建立以二叉連結串列為儲存結構的二叉樹
char ch;
printf("Input:");
ch = getchar();
getchar();
if (ch == '.') T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
if (!T) exit(OVERFLOW);
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
/*char ch;
ch = getchar();
if (ch == '.') T = NULL;
else {
if (!(T = (BiTree)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data = ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;*/
}
status Visit(char e)
{
//列印e的值
printf("%c ", e);
return OK;
}
status PostOrderTraverse(BiTree &T, status(*Visit)(char e))
{
//採用二叉連結串列儲存結構,Visit是對函式資料元素操作的應用
//後序遍歷二叉樹T的非遞迴演算法,對每個資料元素使用函式Visit
SqStack S;
BiTree p=T,q=NULL;//q表示剛剛遍歷過的節點
InitStack(S);
while (p ||! StackEmpty(S))
{
while (p)
{
Push(S, p);
p = p->lchild;
}
GetTop(S, p);
if (p->rchild == NULL || p->rchild== q)
{
if (!Visit(p->data))return ERROR;
q = p;
Pop(S, p);
p = NULL;
}
else
{
p = p->rchild;
}
}
return OK;
}
int main()
{
BiTree T;
//printf("%d",sizeof(BiTNode));
CreateBiTree(T);
printf("PostOrder:");
PostOrderTraverse(T, Visit);
printf("\n");
system("pause");
return 0;
}