/*=============================================
针对二叉搜素树
=============================================*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <stdint.h>
typedef struct treeNode *Tree;
struct treeNode
{
int data;
Tree lchild;
Tree rchild;
};
static Tree create_tree(int value)
{// 创建单个节点
Tree tree = malloc(sizeof(Tree));
if (tree)
{
tree->data = value;
tree->lchild = NULL;
tree->rchild = NULL;
return tree;
}
else
return NULL;
}
static void insert_tree(Tree tree, int in_value)
{// 平衡二叉树插入节点
Tree node;
Tree father_node = tree;
Tree child_node=tree;
int right_ro_left = 0;
while (child_node)
{
father_node = child_node;
if (father_node->data < in_value){
child_node = father_node->rchild;
right_ro_left = 1;
}
if (father_node->data > in_value){
child_node = father_node->lchild;
right_ro_left = 2;
}
}
node = create_tree(in_value);
if (right_ro_left == 1)
father_node->rchild = node;
else if (right_ro_left == 2)
father_node->lchild = node;
}
static void traverse_tree_pro(Tree tree)
{// 前序遍历树
if (tree)
{
printf("%d ", tree->data);
traverse_tree_pro(tree->lchild);
traverse_tree_pro(tree->rchild);
}
}
static void traverse_tree_after(Tree tree)
{// 后序遍历树
if (tree)
{
traverse_tree_after(tree->lchild);
traverse_tree_after(tree->rchild);
printf("%d ", tree->data);
}
}
static void traverse_tree_middle(Tree tree)
{// 中序遍历树
if (tree)
{
traverse_tree_middle(tree->lchild);
printf("%d ", tree->data);
traverse_tree_middle(tree->rchild);
}
}
static Tree find_tree_min(Tree tree)
{//二叉搜索树查找最小值:循环,最小值一定在最左边
if (tree)
{
while (tree->lchild)
{
tree = tree->lchild;
}
}
return tree;
}
static Tree find_tree_max(Tree tree)
{//二叉搜索树查找最大值:循环,最大值一定在最左边
if (tree)
{
while (tree->rchild)
{
tree = tree->rchild;
}
}
return tree;
}
static Tree delete_tree(Tree tree, int value)
{// 删除给定值的节点
Tree tmp;
if (!tree)
printf("not found need delete one!");
else if (value < tree->data)
tree->lchild = delete_tree(tree, value); // 左子树递归删除
else if (value > tree->data)
tree->rchild = delete_tree(tree, value); // 右子树递归删除
else
{// 找到要删除的节点
if (tree->lchild && tree->rchild) // 被删除的节点有左右两个子节点
{
tmp = find_tree_min(tree->rchild);// 在右子树中找最小的元素填充删除节点
tree->data = tmp->data;
tree->rchild = delete_tree(tree->rchild, tmp->data);// 在删除的节点
}
else
{// 被删除节点有一个或者没有子节点
tmp = tree;
if (!tree->lchild && tree->rchild) // 有右孩子或无子节点
tree = tree->rchild;
else if (!tree->rchild && tree->lchild) // 有左孩子或者无子节点
tree = tree->lchild;
free(tree);
}
}
return tree;
}
int main()
{
Tree tree,tmp;
tree = create_tree(10);
insert_tree(tree, 12);
insert_tree(tree, 11);
insert_tree(tree, 19);
insert_tree(tree, 8);
insert_tree(tree, 9);
insert_tree(tree, 7);
insert_tree(tree, 6);
insert_tree(tree, 15);
insert_tree(tree, 14);
traverse_tree_pro(tree);
printf("\n");
traverse_tree_after(tree);
printf("\n");
traverse_tree_middle(tree);
printf("\n");
//delete_tree(tree,11);
//traverse_tree_pro(tree);
system("pause");
return 9;
}