【数据结构练习】二叉树的实现

普通的二叉树代码


/*
   二叉树的实现
*/
#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值