普通的二叉树代码
/*
二叉树的实现
*/
#include <stdio.h>
#include <stdlib.h>
//定义一个节点的结构体
typedef struct _node
{
int data; //节点需要保存的数据
struct _node *p_left; //指向左下方的节点(后继元素)
struct _node *p_right; //指向右下方的节点(后继元素)
}Node;
//定义一个树结构体
typedef struct _tree
{
Node *p_root; //指向数的第一个节点(根元素)
int size; //数中拥有多少个元素
}Tree;
//创建一颗树
Tree* cearte_tree()
{
Tree *tree = malloc(sizeof(Tree)); //在堆申请一块内存空间
tree->p_root = NULL; //没后继元素的话,指针要恢复成空指针
return tree;
}
//创建一个节点,参数为节点的存储内容
Node* cearte_node(int data)
{
Node *node = malloc(sizeof(Node));
node->p_left = NULL;
node->p_right = NULL;
node->data = data;
return node;
}
//为插入的节点选择一个合适的位置
void insert(Node **pp_root, Node *p_node)
{
if (NULL == *pp_root)
{
*pp_root = p_node;
}
else
{
if (p_node->data > (*pp_root)->data)
{
insert(&((*pp_root)->p_left), p_node);
}
else if (p_node->data <= (*pp_root)->data)
{
insert(&((*pp_root)->p_right), p_node);
}
}
}
//插入一个节点
void insert_node(Tree *p_tree, int data)
{
insert(&p_tree->p_root, cearte_node(data));
p_tree->size++;
}
//删除节点
void clear_node(Node **p_node)
{
if (NULL == *p_node)
{
return;
}
else
{
if (NULL != (*p_node)->p_left)
{
clear_node(&(*p_node)->p_left);
}
if (NULL != (*p_node)->p_right)
{
clear_node(&(*p_node)->p_right);
}
free(*p_node);
}
}
//清空二叉树
void clear_tree(Tree *p_tree)
{
if (NULL == p_tree->p_root)
{
return;
}
clear_node(&p_tree->p_root);
}
//摧毁二叉树
void destroy_tree(Tree **pp_tree)
{
clear_tree(*pp_tree);
free(*pp_tree);
*pp_tree = NULL;
}
//打印节点,第二个参数为0,表示打印整棵二叉树
void print(Node *p_node, int i)
{
int k = 0;
if (NULL == p_node)
{
return;
}
if (p_node->p_right != NULL)
{
print(p_node->p_right, i + 1);
}
for (k = 0; k < i; k++)
{
printf(" ");
}
printf("%d\n", p_node->data);
if (p_node->p_left != NULL)
{
print(p_node->p_left, i + 1);
}
}
//打印二叉树
void print_tree(Tree *p_tree, int i)
{
print(p_tree->p_root, 0);
}
//测试代码
int main()
{
Tree *tree = cearte_tree();
int arr[9] = {50, 20, 90, 10, 40, 30, 70, 80, 60};
int arr1[9] = {60, 10, 80, 40, 30, 20, 70, 90, 50};
int i = 0;
for (i = 0; i < 9; i++)
{
insert_node(tree, arr[i]);
}
print_tree(tree, 0);
//clear_tree(tree);
printf("===================================================\n");
for (i = 0; i < 9; i++)
{
insert_node(tree, arr1[i]);
}
print_tree(tree, 0);
destroy_tree(&tree);
if (NULL == tree)
{
printf("was destory\n");
}
return 0;
}