主要做记录,直接代码,理论以后再补吧
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#define ElemType char
#define STACK_DE 1
//the input can is :bef##d##cg##a##
char input_s[64] = {0};
int count = 0;
typedef struct node
{
ElemType value;
struct node * lchild;
struct node * rchild;
}NODE;
//if not use recursion, use stack
typedef struct stack
{
NODE * node;
bool is_out;
struct stack * next;
}STACK;
STACK * top = NULL;
static void push(NODE * node)
{
STACK * t = (STACK * )malloc(sizeof(STACK));
if(NULL == t)
printf("error\n");
t->node = node;
t->next = top;
top = t;
}
static void pop(NODE **node)
{
if(top == NULL)
{
*node = NULL;
}
STACK * stack = top;
top = top->next;
*node = stack->node;
free(stack);
}
static bool is_stack_empty()
{
if(top == NULL)
{
return true;
}
else{
return false;
}
}
static NODE * pro_create_tree(int layer)
{
NODE * T;
char ch;
// printf("input\n");
// scanf("%c",&ch);
ch = input_s[count];
count++;
printf("get char %c\n",ch);
if(ch == '#')
{
//printf("stop\n");
return NULL;
}
setbuf(stdin,NULL);
printf("start malloc\n");
T = (NODE *)malloc(sizeof(NODE));
if(NULL == T)
printf("error\n");
printf("layer = %d\n",layer);
T->value = ch;
T->lchild = pro_create_tree(layer + 1);
T->rchild = pro_create_tree(layer + 1);
return T;
}
//pro_traverse
static void pro_traverse(NODE * T)
{
if(NULL == T)
return;
printf("%c ",T->value);
pro_traverse(T->lchild);
pro_traverse(T->rchild);
}
static void pro_traverse_s(NODE* T)
{
NODE * temp= NULL;
temp = T;
while(temp != NULL || !is_stack_empty())
{
while(temp != NULL)
{
printf("%c ",temp->value);
push(temp);
temp = temp->lchild;
}
if(!is_stack_empty())
{
pop(&temp);
temp = temp->rchild;
}
}
}
//mid traverse
static void in_traverse(NODE * T)
{
if(NULL == T)
return;
in_traverse(T->lchild);
printf("%c ",T->value);
in_traverse(T->rchild);
}
static void in_traverse_s(NODE * T)
{
NODE * temp = T;
while(temp != NULL || !is_stack_empty())
{
while(temp)
{
push(temp);
temp = temp->lchild;
}
if(!is_stack_empty())
{
pop(&temp);
printf("%c ",temp->value);
temp = temp->rchild;
}
}
}
static void post_traverse(NODE * T)
{
if(NULL == T)
return;
post_traverse(T->lchild);
post_traverse(T->rchild);
printf("%c ",T->value);
}
static void post_traverse_s(NODE * T)
{
NODE * temp = T;
while(T || !is_stack_empty())
{
while(temp)
{
}
}
}
int main(int argc, char *argv[])
{
memcpy(input_s,argv[1],strlen(argv[1]));
NODE * root = pro_create_tree(1);
printf("ok\n");
printf("pre_traverse:\n");
pro_traverse(root);
printf("\n");
pro_traverse_s(root);
printf("\n\n");
printf("in_traverse:\n");
in_traverse(root);
printf("\n");
in_traverse_s(root);
printf("\n\n");
printf("post_traverse:\n");
post_traverse(root);
printf("\n");
}