/*
* Expression_Tree
* Date: 2013/3/19
* NolanJian
*/
#include <stdio.h>
#include <stdlib.h>
struct node;
struct stack;
typedef struct node Node;
typedef Node *NodePointer;
typedef struct stack Stack;
typedef Stack *StackPointer;
NodePointer Create(char *str);
NodePointer GetTop(StackPointer top);
void Push(StackPointer *top, NodePointer p);
void Pop(StackPointer *top);
void inorder(NodePointer p);
void preorder(NodePointer p);
void postorder(NodePointer p);
struct node {
char ch;
NodePointer LeftChild, RightChild;
};
struct stack {
NodePointer p;
StackPointer Next;
};
int main() {
char *expression = "ab+cde+**";
NodePointer root = Create(expression);
preorder(root);
printf("\n");
inorder(root);
printf("\n");
postorder(root);
printf("\n");
}
NodePointer Create(char *str) {
NodePointer tp1, tp2, p;
StackPointer top = NULL;
while(*str) {
if(*str >= 'a' && *str <= 'z') {
p = (NodePointer)malloc(sizeof(Node));
p->ch = *str;
p->LeftChild = NULL;
p->RightChild = NULL;
Push(&top, p);
str++;
continue;
}
p = (NodePointer)malloc(sizeof(Node));
tp1 = GetTop(top);
Pop(&top);
tp2 = GetTop(top);
Pop(&top);
p->ch = *str;
p->LeftChild = tp2;
p->RightChild = tp1;
Push(&top, p);
str++;
}
return top->p;
}
NodePointer GetTop(StackPointer top) {
return top->p;
}
void Push(StackPointer *top, NodePointer p) {
StackPointer tmp;
if(*top == NULL){
*top = (StackPointer)malloc(sizeof(Stack));
(*top)->p = p;
(*top)->Next = NULL;
}
tmp = (StackPointer)malloc(sizeof(Stack));
tmp->p = p;
tmp->Next = (*top);
*top = tmp;
}
void Pop(StackPointer *top) {
StackPointer p = *top;
*top = (*top)->Next;
free(p);
}
void inorder(NodePointer p) {
if(p) {
inorder(p->LeftChild);
printf("%c", p->ch);
inorder(p->RightChild);
}
}
void preorder(NodePointer p) {
if(p) {
printf("%c", p->ch);
preorder(p->LeftChild);
preorder(p->RightChild);
}
}
void postorder(NodePointer p) {
if(p) {
postorder(p->LeftChild);
postorder(p->RightChild);
printf("%c", p->ch);
}
}