数据结构—二叉树

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗里い着迷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值