#include <iostream>
#include <malloc.h>
using namespace std;
const int MaxSize = 50;
typedef char ElementType;
typedef struct bitnode
{
ElementType data;
struct bitnode *left, *right;
} bitnode, *bitree;
void CreateTree(bitree &b, char str[]);
void PrinTree(bitree b);
void PreOrder(bitree b);
void InOrder(bitree b);
void PostOrder(bitree b);
void LevelOrder(bitree b);
bitree FreeTree(bitree b);
void CreateTree(bitree &b, char str[])
{
char ch;
bitree stack[MaxSize],p;
int top = -1, k, j = 0;
while( (ch = str[j++]) != '\0' )
{
switch(ch)
{
case '(':
top++;
stack[top] = p;
k = 1;
break;
case ',':
k = 2;
break;
case ')':
top--;
break;
default:
p = (bitree)malloc(sizeof(bitnode));
p->data = ch;
p->left = p->right = NULL;
if( b == NULL )
b = p;
else
{
switch(k)
{
case 1:
stack[top]->left = p;
break;
case 2:
stack[top]->right = p;
break;
}
}
}
}
}
void PrinTree(bitree b)
{
if( b )
{
cout << b->data;
if( b->left != NULL || b->right != NULL )
{
cout << "(";
PrinTree(b->left);
if(b->right != NULL)
cout << ",";
PrinTree(b->right);
cout << ")";
}
}
}
bitree FreeTree(bitree b)
{
if( b != NULL )
{
FreeTree(b->left);
FreeTree(b->right);
free(b);
b = NULL;
}
return b; //return NULL;
}
void PreOrder(bitree b)//先序遍历
{ if (b!=NULL)
{ printf("%c ",b->data);
PreOrder(b->left);
PreOrder(b->right);
}
}
void InOrder(bitree b)//中序遍历
{ if (b!=NULL)
{ InOrder(b->left);
printf("%c ",b->data);
InOrder(b->right);
}
}
void PostOrder(bitree b)//后序遍历
{ if (b!=NULL)
{ PostOrder(b->left);
PostOrder(b->right);
printf("%c ",b->data);
}
}
void LevelOrder(bitree b){//层次遍历
bitnode *p;
bitnode *qu[MaxSize];
int front,rear;
front=rear=0;
rear++;
qu[rear]=b;
while(front!=rear){
front=(front+1)%MaxSize;
p=qu[front];
printf("%c",p->data);
if(p->left!=NULL){
rear=(rear+1)%MaxSize;
qu[rear]=p->left;
}
if(p->right!=NULL){
rear=(rear+1)%MaxSize;
qu[rear]=p->right;
}
}
}
int main(){
char str[] = "-(+(a,*(b,-(c,d))),/(e,f))";
bitree root = NULL;
CreateTree(root,str);
cout << "str字符串:" << str << endl;
cout << "嵌套表示法:";
PrinTree(root);
cout << endl <<"先序遍历:";
PreOrder(root);
cout << endl <<"中序遍历:";
InOrder(root);
cout << endl <<"后序遍历:";
PostOrder(root);
cout << endl <<"层次遍历:";
LevelOrder(root);
cout << endl;
root = FreeTree(root);
if( root == NULL )
cout << "释放成功" << endl;
return 0;
}