#include<stdio.h>
#include<stdlib.h>
#include"tree.h"
void tree_init(tree_t *t){
t->root = NULL;
t->number = 0;
}
void tree_deinit(node_t* t){
if(t==NULL){
return;
}
tree_deinit(t->left);
tree_deinit(t->right);
free(t);
}
void tree_insert(tree_t *t, int data){
node_t* new = malloc(sizeof(node_t));
new->data = data;
new->left = NULL;
new->right = NULL;
if(t->root == NULL){
t->root = new;
t->number++;
return;
}
node_t *p1 ,*p2;
p1 = p2 = t->root;
while(p2 != NULL){
p1 = p2;
if(p2->data > data){
p2 = p2->left;
}else{
p2 = p2->right;
}
}
if(data > p1->data){
p1->right = new;
}else{
p1->left = new;
}
t->number++;
}
void tree_del(tree_t *t, int data){
node_t *p1 ,*p2;
p1 = p2 = t->root;
while(p2 != NULL && p2->data != data){
p1 = p2;
if(p2->data < data){
p2 = p2->right;
}else if(p2->data > data){
p2 = p2->left;
}
}
if(p2 == NULL){
return;
}
node_t* left = p2->left;
node_t* right = p2->right;
if(left != NULL && right == NULL){
if(p1->data > p2->data){
p1->left = left;
}else{
p1->right = left;
}
}
else if(right != NULL && left == NULL){
if(p1->data < p2->data){
p1->right = right;
}else{
p1->left = right;
}
}
else if(right == NULL && left == NULL){
if(p1->data < p2->data){
p1->right = NULL;
}else{
p1->left = NULL;
}
}
else if(right != NULL && left != NULL){
node_t *p3 ,*p4;
p3 = p4 = right;
while(p4 != NULL){
p3 = p4;
p4 = p4->left;
}
p3->left = left;
if(p1->data > p2->data){
p1->left = right;
}else {
p1->right = right;
}
}
free(p2);
p2=NULL;
t->number--;
}
void tree_first(node_t *t){
if(t==NULL){
return;
}
printf("%d ",t->data);
tree_first(t->left);
tree_first(t->right);
}
void tree_mid(node_t *t){
if(t==NULL){
return;
}
tree_mid(t->left);
printf("%d ",t->data);
tree_mid(t->right);
}
void tree_last(node_t *t){
if(t==NULL){
return;
}
tree_last(t->left);
tree_last(t->right);
printf("%d ",t->data);
}