#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#define Maxsize 100
typedef char Elemtype;
typedef struct BiTNode
{
Elemtype data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
typedef struct Stack
{
BiTree data[Maxsize];
int top;
}SqStack;
void InitStack(SqStack* S);
bool Push(SqStack* S, BiTree x);
bool Pop(SqStack* S, BiTree* x);
void CreateBiTree2(BiTree* T, char* str2);
void PreOrder(BiTree T);
void visit(BiTree T);
void DispBiTree(BiTree T);
void GetStr(char* str);
int main(void)
{
BiTree T = NULL;
char str[50];
GetStr(str);
CreateBiTree2(&T, str);
printf("二叉树的先序遍历:\n");
PreOrder(T);
printf("二叉树的括号表示法:");
DispBiTree(T);
return 0;
}
void InitStack(SqStack* S)
{
S->top = -1;
}
bool Push(SqStack* S, BiTree x)
{
if (S->top == Maxsize - 1)
return false;
S->data[++(S->top)] = x;
return true;
}
bool Pop(SqStack* S, BiTree* x)
{
if (S->top == -1)
return false;
*x = S->data[(S->top)--];
return true;
}
void CreateBiTree2(BiTree* T, char* str)
{
SqStack S;
BiTree p = NULL, x;
InitStack(&S);
char ch;
int i = 0, k;
ch = str[i];
while (ch != '\0')
{
switch (ch)
{
case '(': Push(&S, p);
k = 1;
break;
case ')': Pop(&S, &x);
break;
case ',': k = 2;
break;
default:
p = (BiTree)malloc(sizeof(BiTNode));
p->data = ch; p->lchild = p->rchild = NULL;
if ((*T) == NULL)
(*T) = p;
else
{
switch (k)
{
case 1: S.data[S.top]->lchild = p; break;
case 2: S.data[S.top]->rchild = p; break;
}
}
}
i++;
ch = str[i];
}
}
void PreOrder(BiTree T)
{
if (T != NULL)
{
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
void visit(BiTree T)
{
printf("树结点的值:%c\n", T->data);
}
void GetStr(char* str)
{
printf("请输入由二叉树构成的广义表字符串:");
scanf("%s", str);
}
void DispBiTree(BiTree T)
{
if (T != NULL)
{
printf("%c", T->data);
if (T->lchild != NULL || T->rchild != NULL)
{
printf("(");
DispBiTree(T->lchild);
if (T->rchild != NULL)
printf(",");
DispBiTree(T->rchild);
printf(")");
}
}
}