1. 程式人生 > >棧實現二叉樹非遞迴先序遍歷

棧實現二叉樹非遞迴先序遍歷

#include "stdio.h"
#include "stdlib.h"
typedef struct TreeNode *Tree;
typedef char ElementType;
typedef struct stack *Stack;
typedef Tree ElementTypeOfStack;
struct TreeNode
{
ElementType Data;
Tree Left;
Tree Right;
};
struct stack
{
ElementTypeOfStack *DataArray;
int Top;
int Size;
int Capacity;
};
Tree CreatTree(Tree T);
void PrintTreeWithStack(Tree T);
void PrintTree(Tree T);
Stack CreatStack(int Capacity);
int Push(ElementTypeOfStack X, Stack S);
ElementTypeOfStack Pop(Stack S);
int IsEmpty(Stack S);
int main(int argc, char const *argv[])
{
Tree T = NULL;
T = CreatTree(T);
printf("用棧先序輸出:");
PrintTreeWithStack(T);
printf("遞迴先序輸出:");
PrintTree(T);
return 0;
}
Tree CreatTree(Tree T)
{
char ch;
scanf("%c",&ch);
if(ch == '#')
{
return NULL;
}else
{
T = (Tree)malloc(sizeof(struct TreeNode));
T->Data = ch;
T->Left = CreatTree(T->Left);
T->Right = CreatTree(T->Right);
return T;
}
}
void PrintTreeWithStack(Tree T)
{
if (T == NULL)
{
printf("樹為空\n");
}
Stack S = CreatStack(50);//建立容量為50的棧
while(T || !IsEmpty(S))
{
while(T)
{
Push(T,S);
printf("%c ", T->Data);
T = T->Left;
}
T = Pop(S);
T = T->Right;
}
printf("\n");
}
void PrintTree(Tree T)
{
if(T)
{
printf("%c ",T->Data);
PrintTree(T->Left);
PrintTree(T->Right);
}
}
Stack CreatStack(int Capacity)
{
Stack S = (Stack)malloc(sizeof(struct stack));
S->DataArray = (ElementTypeOfStack*)malloc(sizeof(ElementTypeOfStack)*Capacity);
S->Top = -1;
S->Size = 0;
S->Capacity = Capacity;
return S;
}
int Push(ElementTypeOfStack X, Stack S)
{
if (S->Size == S->Capacity)
{
return 0;
}
S->Top++;
S->DataArray[S->Top] = X;
S->Size++;
return 1;
}
ElementTypeOfStack Pop(Stack S)
{
if (S->Size == 0)
{
return NULL;
}
S->Size--;
return S->DataArray[S->Top--];
}
int IsEmpty(Stack S)
{
return S->Size == 0;
}