二叉树的基础操作实现

简单二叉树(Binary Tree)

二叉树特点是每个结点最多只能有两棵子树,且有左右之分 。

创建节点

Tree* tree_create(DATA data)//初始化
{
	Tree *root=(Tree *)malloc(sizeof(Tree));
	if(!root)
	{
		puts("创建root失败");
		return NULL;
	}
	root -> data = data;
	root -> left = NULL;
	root -> right = NULL;
	
	return root;
}

二叉树插入

二叉树插入必须满足节点左边的值小于节点的值,节点右边的值大于节点的值。
在这里插入图片描述

int tree_add(Tree **root,DATA data)//插入
{
	if(*root == NULL)
	{
		puts("没有根节点");
		*root = tree_create(data);
		if(*root == NULL)
		{
			return -1;
		}
		else
		{
			return 0;
		}
	}
	Tree *pnew = tree_create(data);
	Tree *p=*root,*parent = NULL;
	while(p)
	{
		parent = p;
		if(data > (p->data))
		{
			p = p -> right;
		}
		else
		{
			p = p -> left;
		}	
	}
	
	if(parent -> data < data) 
	{
		parent -> right = pnew;
	}
	else
	{
		parent -> left = pnew;
	}
	
	return 0;
}

二叉树查找

Tree* tree_find(Tree *root,DATA aim)//查找
{
	if(!root)
	{
		return NULL;
	}
	Tree *p = root;
	while(p)
	{
		if(p -> data > aim)
			p = p -> left;
		else if(p -> data < aim)
			p = p -> right;
		else if(p -> data == aim)
			return p;
	}
	return NULL;
}

二叉树删除

Tree* tree_deleate(Tree *root,DATA aim)//删除
{
	if(!root)
		return NULL;
	Tree *p = root,*q = root,*np=NULL;
	while(p)
	{
		if(p -> data > aim)
		{
			q=p;
			p = p -> left;
		}
			
		else if(p -> data < aim)
		{
			q=p;
			p = p -> right;
		}
		else if(p -> data == aim)
		{
			if(p->right==NULL&&p->left==NULL)
			{
				if(q->left==p)
				{
					q->left=NULL;
					free(p);
				}
				else if(q->right==p)
				{
					q->right=NULL;
					free(p);
				}
			}
			else if(p->right==NULL&&p->left!=NULL)
			{
				if(q->left==p)
				{
					q->left=q->left->left;
					free(p);
				}
				else if(q->right==p)
				{
					q->right=q->right->left;
					free(p);
				}
			}
			else if(p->right!=NULL&&p->left==NULL)
			{ 
				if(q->left==p)
				{
					q->left=q->left->right;
					free(p);
				}
				else if(q->right==p)
				{
					q->right=q->right->right;
					free(p);
				}
			}
			else if(p->right!=NULL&&p->left!=NULL)
			{
				q=p;
				p=p->right;
				while(p->left!=NULL)
				{
					np=p;
					p=p->left;
				}
				puts("!");
				printf("%d\n",p->data);
				q->data=p->data;					
				if(p->right==NULL)
				{
					np->left=NULL;
				}
				else
				{
					np->left=np->left->right;
				}
				
			}
			return root;
		}	
	}
	printf("没有该数据\n");
	return root;
}

二叉树打印

void PreOrder(Tree *root)//输出
{
	if(!root)
	{
		return ;
	}
	//printf("%d  ",root -> data);//前序输出
	PreOrder(root -> left);
	printf("%d  ",root -> data);//中序输出可排序
	PreOrder(root -> right);
	//printf("%d  ",root -> data);//后序输出
}

源代码链接
提取码:btct
链接失效,请联系我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值