编写源文件:02tree.c
/*
二叉树演示
*/
#include <stdlib.h>
#include "02tree.h"
//初始化函数
void tree_init(tree *p_tree) {
p_tree->p_node = NULL;
}
//清理函数
void tree_deinit(tree *p_tree) {
if (!(p_tree->p_node)) {
return ;
}
tree_deinit(&(p_tree->p_node->left));
tree_deinit(&(p_tree->p_node->right));
free(p_tree->p_node);
p_tree->p_node = NULL;
}
//在有序二叉树里查找某个数字所在的位置
tree *tree_search_in_order(const tree*p_tree, int num) {
if (!(p_tree->p_node)) {
return (tree *)p_tree;
}
if (p_tree->p_node->num == num) {
return (tree *)p_tree;
}
else if (p_tree->p_node->num > num) {
return tree_search_in_order(&(p_tree->p_node->left), num);
}
else {
return tree_search_in_order(&(p_tree->p_node->right), num);
}
}
//在有序二叉树里插入新数字
void tree_insert_in_order(tree *p_tree, intnum) {
tree *p_tr = tree_search_in_order(p_tree, num);
if (p_tr->p_node) {
return ;
}
node *p_tmp = (node *)malloc(sizeof(node));
if (!p_tmp) {
return ;
}
p_tmp->num= num;
p_tmp->left.p_node = NULL;
p_tmp->right.p_node = NULL;
p_tr->p_node = p_tmp;
}
//中序遍历函数
void tree_miter(tree *p_tree, void(*p_func)(int)) {
if (!(p_tree->p_node)) {
return ;
}
tree_miter(&(p_tree->p_node->left), p_func);
p_func(p_tree->p_node->num);
tree_miter(&(p_tree->p_node->right), p_func);
}
//前序遍历函数
void tree_fiter(tree *p_tree, void(*p_func)(int)) {
if (!(p_tree->p_node)) {
return ;
}
p_func(p_tree->p_node->num);
tree_fiter(&(p_tree->p_node->left), p_func);
tree_fiter(&(p_tree->p_node->right), p_func);
}
//后序遍历函数
void tree_liter(tree *p_tree, void(*p_func)(int)) {
if (!(p_tree->p_node)) {
return ;
}
tree_liter(&(p_tree->p_node->left), p_func);
tree_liter(&(p_tree->p_node->right), p_func);
p_func(p_tree->p_node->num);
}
//从有序二叉树里删除一个数字的函数
void tree_remove(tree *p_tree, int num) {
node *p_remove = NULL, *p_left = NULL, *p_right = NULL;
tree *p_tmp = tree_search_in_order(p_tree, num);
if (!(p_tmp->p_node)) {
return ;
}
p_remove = p_tmp->p_node;
p_left = p_remove->left.p_node;
p_right = p_remove->right.p_node;
if (!p_left) {
p_tmp->p_node = p_right;
}
else if (!p_right) {
p_tmp->p_node = p_left;
}
else {
tree *p_tmp1 = tree_search_in_order(&(p_remove->left),p_right->num);
p_tmp1->p_node = p_right;
p_tmp->p_node = p_left;
}
free(p_remove);
p_remove = NULL;
}
编写头文件:02tree.h
#ifndef __02TREE_H__
#define __02TREE_H__
struct node;
typedef struct {
struct node *p_node;
} tree;
typedef struct node {
int num;
tree left;
tree right;
} node;
//初始化函数
void tree_init(tree *);
//清理函数
void tree_deinit(tree *);
//在有序二叉树里查找某个数字所在的位置
tree *tree_search_in_order(const tree *,int );
//在有序二叉树里插入新数字
void tree_insert_in_order(tree *, int );
//中序遍历函数
void tree_miter(tree *, void (*)(int));
//前序遍历函数
void tree_fiter(tree *, void (*)(int));
//后序遍历函数
void tree_liter(tree *, void (*)(int));
//从有序二叉树里删除数字的函数
void tree_remove(tree *, int);
#endif //__02TREE_H__
编写主函数:02main.c
#include <stdio.h>
#include "02tree.h"
void print_cb(int num) {
printf("%d ", num);
}
int main() {
tree tr = {0};
tree_init(&tr);
tree_insert_in_order(&tr, 50);
tree_insert_in_order(&tr, 25);
tree_insert_in_order(&tr, 80);
tree_insert_in_order(&tr, 13);
tree_insert_in_order(&tr, 37);
tree_insert_in_order(&tr, 61);
tree_insert_in_order(&tr, 93);
tree_insert_in_order(&tr, 7);
tree_remove(&tr, 25);
tree_miter(&tr, print_cb);
printf("\n");
tree_deinit(&tr);
return 0;
}