#include <stdio.h>
#include <stdlib.h>
struct Node;
typedef struct{
struct Node *pnode;
}tree;
typedef struct Node{
int data;
tree left;
tree right;
}node;
//树的初始化函数
void tree_init(tree *pt)
{
pt->pnode = NULL;
}
//树的清理函数
void tree_delete(tree *pt)
{
if(!(pt->pnode))
return;
tree_delete(&(pt->pnode->left));
tree_delete(&(pt->pnode->right));
free(pt->pnode);
pt->pnode = NULL;
}
//统计有效节点个数
int tree_size(const tree *pt)
{
int cnt = 0;
if(!(pt->pnode))
return 0;
cnt = tree_size(&(pt->pnode->left));
cnt += tree_size(&(pt->pnode->right));
return cnt + 1;
}
//在有序二叉树里查找某个数字所在位置的函数
tree *tree_search(const tree *pt, int val)
{
if(!(pt->pnode)){
return (tree *)pt;
}
if(pt->pnode->data == val){
return (tree *)pt;
}
else if(pt->pnode->data > val){
return tree_search(&(pt->pnode->left), val);
}
else{
return tree_search(&(pt->pnode->right), val);
}
}
//在有序二叉树里加入新节点的函数
int tree_insert(tree *pt, int val)
{
node *new = NULL;
tree *tmp = tree_search(pt, val);
if(tmp->pnode){
return 0;
}
new = (node *)malloc(sizeof(node));
if(!new){
return 0;
}
new->data = val;
new->left.pnode = NULL;
new->right.pnode = NULL;
tmp->pnode = new;
return 1;
}
//以中序遍历方式处理有序二叉树里所有节点的函数
void tree_miter(tree *pt, void (*func)(int))
{
if(!(pt->pnode))
return;
tree_miter(&(pt->pnode->left), func);
func(pt->pnode->data);
tree_miter(&(pt->pnode->right), func);
}
//删除某个数字所在节点的函数
int tree_remove(tree *pt, int val)
{
node *rem = NULL;
tree *tmp = tree_search(pt, val);
if(!(tmp->pnode)){
return 0;
}
rem = tmp->pnode;
if(!(rem->left.pnode) && !(rem->right.pnode)){
//没有子节点
tmp->pnode = NULL;
}
else if(!(rem->left.pnode)){
//只有右子树存在
tmp->pnode = rem->right.pnode;
}
else if(!(rem->right.pnode)){
//只有左子树存在
tmp->pnode = rem->left.pnode;
}
else{
//左右子树都存在
tree *tmp1 = tree_search(&(rem->left), rem->right.pnode->data);
tmp1->pnode = rem->right.pnode;
tmp->pnode = rem->left.pnode;
}
free(rem);
rem = NULL;
return 1;
}
void print_cb(int val)
{
printf("%d ", val);
}
int main()
{
tree tr = {0};
tree_init(&tr);
tree_insert(&tr, 50);
tree_insert(&tr, 30);
tree_insert(&tr, 70);
tree_insert(&tr, 20);
tree_insert(&tr, 40);
tree_insert(&tr, 60);
tree_insert(&tr, 80);
tree_insert(&tr, 45);
tree_insert(&tr, 65);
tree_remove(&tr, 30);
printf("size=%d\n", tree_size(&tr));
tree_miter(&tr, print_cb);
printf("\n");
tree_delete(&tr);
return 0;
}