简单二叉树(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
链接失效,请联系我