之前写过一个层序遍历的笔记,今天写了下前中后序遍历
#include <stdio.h>
#include <malloc.h>
#define SIZE 20
typedef struct Node *n_pointer;
typedef struct Node{
n_pointer left;
n_pointer right;
int key;
};
int top = -1;//init stack
n_pointer stack[SIZE];
int is_empty()
{
return top == -1;
}
void input(n_pointer *root, int item)
{
if(*root){
if(item < (*root)->key)
input(&((*root)->left), item);
else if(item > (*root)->key)
input(&((*root)->right), item);
else
printf("The same value \n");
}else{
n_pointer ptr = (n_pointer)malloc(sizeof(struct Node));
ptr->key = item;
ptr->left = NULL;
ptr->right = NULL;
(*root) = ptr;
}
}
//递归版本,验证非递归版本
void print_tree(n_pointer root)
{
if(root){
print_tree(root->left);
printf("%d ", root->key);
print_tree(root->right);
}
else
return;
}
void pre_order(n_pointer root)
{
if(root){
n_pointer ptr;
stack[++top] = root;
while(!is_empty()){
ptr = stack[top--];//stack decrease
printf("%d ", ptr->key);
if(ptr->right){
stack[++top] = ptr->right;
}
if(ptr->left){
stack[++top] = ptr->left;
}
}
}
else
return;
}
void in_order(n_pointer root)
{
if(root){
n_pointer ptr = root;
stack[++top] = root;
while(ptr = ptr->left){
stack[++top] = ptr;
}//now, ptr is the lefist node
while(!is_empty()){
ptr = stack[top--];
printf("%d ", ptr->key);
if(ptr->right){
ptr = ptr->right;
stack[++top] = ptr;
while(ptr = ptr->left){
stack[++top] = ptr;
}
}
}
}
else
return;
}
void last_order(n_pointer root)
{
}
int main( void )
{
n_pointer root = NULL;
input(&root, 7);
input(&root, 1);
input(&root, 9);
input(&root, 5);
input(&root, 10);
input(&root, 0);
input(&root, 4);
input(&root, 3);
input(&root, 12);
input(&root, 11);
print_tree(root);
printf("\n");
in_order(root);
return 0;
}