1. 程式人生 > >擴充套件的先序遍歷序列建立以二叉連結串列方式儲存的二叉樹,後序遍歷

擴充套件的先序遍歷序列建立以二叉連結串列方式儲存的二叉樹,後序遍歷

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; }