#ifndef _SIMPLETREE_H_
#define _SIMPLETREE_H_
typedef struct _node {
int m_data;
struct _node* m_left;
struct _node* m_right;
} node_t;
void tree_insert (node_t** root, int data);
void tree_remove (node_t** root, int data);
void tree_display (node_t* root, int index);
void tree_distroy (node_t** root);
#endif
#include <stdio.h>
#include <malloc.h>
#include "simpletree.h"
node_t** tree_findNode (node_t** root, int data);
node_t** tree_findPre (node_t** root);
void tree_insert (node_t** root, int data) {
if (!(*root)) {
*root = (node_t*)malloc(sizeof(node_t));
(*root)->m_left = 0;
(*root)->m_right = 0;
(*root)->m_data = data;
}
else if ((*root)->m_data > data) {
tree_insert (&(*root)->m_left, data);
}
else {
tree_insert (&(*root)->m_right, data);
}
}
void tree_remove (node_t** root, int data) {
node_t **thisnode, **prenode, *tmp;
thisnode = tree_findNode (root, data);
if (!(*thisnode)) {
return;
}
prenode = tree_findPre (&(*thisnode)->m_left);
if (!(*prenode)) {
tmp = *thisnode;
*thisnode = (*thisnode)->m_right;
free (tmp);
}
else {
tmp = *prenode;
(*thisnode)->m_data = (*prenode)->m_data;
*prenode = (*prenode)->m_left;
free (tmp);
}
}
void tree_display (node_t* root, int index) {
int cusor;
if (!root) {
return;
}
tree_display (root->m_right, index + 1);
for (cusor = 0; cusor < index; ++cusor) {
printf (" ");
}
printf ("%d\n",root->m_data);
tree_display (root->m_left, index + 1);
}
void tree_destroy (node_t** root) {
if (!(*root)) {
return;
}
tree_destroy (&(*root)->m_left);
tree_destroy (&(*root)->m_right);
free (*root);
*root = 0;
}
node_t** tree_findNode (node_t** root, int data) {
if (!(*root) || (*root)->m_data == data) {
return root;
}
if ((*root)->m_data > data) {
return tree_findNode (&(*root)->m_left, data);
}
return tree_findNode (&(*root)->m_right, data);
}
node_t** tree_findPre (node_t** root) {
if (!(*root) || !(*root)->m_right) {
return root;
}
return tree_findPre (&(*root)->m_right);
}
int main () {
node_t* root = 0;
tree_insert (&root, 20);
tree_insert (&root, 10);
tree_insert (&root, 40);
tree_insert (&root, 5);
tree_insert (&root, 1);
tree_insert (&root, 7);
tree_insert (&root, 15);
tree_insert (&root, 12);
tree_insert (&root, 16);
tree_insert (&root, 32);
tree_insert (&root, 27);
tree_insert (&root, 38);
tree_insert (&root, 45);
tree_insert (&root, 41);
tree_insert (&root, 51);
tree_display (root, 0);
tree_remove (&root, 20);
tree_remove (&root, 45);
printf ("---------------\n");
tree_display (root, 0);
tree_destroy (&root);
return 0;
}