#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *left;
struct node *right;
}node_t;
typedef struct tree{
node_t *root;
int cnt;
}tree_t;
// 初始化二叉树
void tree_init(tree_t *tree)
{
tree->root = NULL;
tree->cnt = 0;
}
// 创建节点函数
static node_t *creat_node(int data)
{
node_t *pnode = (node_t *)malloc(sizeof(node_t));
pnode->data = data;
pnode->left = NULL;
pnode->right = NULL;
return pnode;
}
// 插入节点函数
static void insert(node_t **proot ,node_t *pnode)
{
if(NULL == *proot){
*proot = pnode;
return;
}
else if(pnode->data < (*proot)->data){
insert(&(*proot)->left ,pnode);
return;
}
else{
insert(&(*proot)->right ,pnode);
return;
}
}
// 向二叉树插入数据
void insert_node(tree_t *tree ,int data)
{
node_t *pnode = creat_node(data);
insert(&(tree->root) ,pnode);
tree->cnt++;
}
// 获取二叉树节点个数
int size_node(tree_t *tree)
{
return tree->cnt;
}
// 遍历节点函数
static void travel(node_t *proot)
{
if(proot != NULL){
travel(proot->left);
printf("%d " ,proot->data);
travel(proot->right);
}
}
// 遍历树
void tree_travel(tree_t *tree)
{
printf("中序遍历:");
travel(tree->root);
printf("\n");
}
// 清空节点函数
static void clear_node(node_t **proot)
{
if(NULL != *proot){
clear_node(&(*proot)->left);
clear_node(&(*proot)->right);
free(*proot);
*proot = NULL;
}
}
// 清空树
void clear_tree(tree_t *tree)
{
clear_node(&tree->root);
tree->cnt = 0;
}
// 查找节点
static node_t **find_node(node_t **proot ,int data)
{
if(NULL == *proot || data == (*proot)->data)
return proot;
else if(data < (*proot)->data)
find_node(&(*proot)->left ,data);
else
find_node(&(*proot)->right ,data);
}
// 删除节点
void del_node(tree_t *tree ,int data)
{
node_t **pnode = find_node(&tree->root ,data);
if(NULL == *pnode){
printf("要删除的节点不存在。\n");
return;
}
insert(&(*pnode)->right ,(*pnode)->left);
node_t *ptmp = *pnode;
*pnode = (*pnode)->right;
free(ptmp);
ptmp = NULL;
tree->cnt--;
}
// 修改节点
void modify_node(tree_t *tree ,int old_data ,int new_data)
{
node_t **pnode = find_node(&tree->root ,old_data);
if(NULL == *pnode){
printf("要修改的节点不存在。\n");
return;
}
del_node(tree ,old_data);
insert_node(tree ,new_data);
}
int main(void)
{
tree_t tree;
tree_init(&tree);
insert_node(&tree ,50);
insert_node(&tree ,20);
insert_node(&tree ,70);
insert_node(&tree ,10);
insert_node(&tree ,60);
insert_node(&tree ,40);
insert_node(&tree ,80);
insert_node(&tree ,90);
insert_node(&tree ,30);
tree_travel(&tree);
printf("节点个数为%d\n" ,size_node(&tree));
del_node(&tree ,50);
del_node(&tree ,30);
del_node(&tree ,20);
del_node(&tree ,5);
modify_node(&tree ,10 ,250);
modify_node(&tree ,6 ,300);
modify_node(&tree ,60 ,300);
// clear_tree(&tree);
insert_node(&tree ,70);
insert_node(&tree ,10);
insert_node(&tree ,60);
tree_travel(&tree);
clear_tree(&tree);
tree_travel(&tree);
return 0;
}
数据结构—二叉树
最新推荐文章于 2024-09-09 17:57:44 发布