//二叉排序树
//可以用来排序
#include<stdio.h>
#include<stdlib.h>
//定义树节点
struct Binode
{
int data;
Binode* lchild;
Binode* rchild;
};
//插入函数构建
void BSTinsert(Binode* &root, int key)//指针引用可修改指针的值,否则智能修改指针所指的值
{
if (root == NULL)
{
root = (Binode*)malloc(sizeof(Binode));
root->data = key;
root->lchild = NULL;
root->rchild = NULL;
}//递归一直找到指针指向为空的适合位置安放新结点
else
{
if (key < root->data)
return BSTinsert(root->lchild, key);
else
return BSTinsert(root->rchild, key);
}
}
//使用插入函数动态构造二叉排序树
Binode* Createbitree(int a[], int n)
{
Binode* root=NULL;
for (int i = 0; i < n; i++)
BSTinsert(root, a[i]);
return root;
}
//删除结点函数
void Deletenode(Binode* &bt, int key)
{
Binode* p;
if (bt->lchild == NULL && bt->rchild == NULL)//左右孩子均为空
{
p = bt;
bt = NULL;
free(p);
}
else if (bt->lchild==NULL)//左孩子为空
{
p = bt;
bt = bt->rchild;
free(p);
}
else if (bt->rchild == NULL)//右孩子为空
{
p = bt;
bt = bt->lchild;
free(p);
}
else//左右孩子均存在
{
Binode* parent = bt;//parent记录双亲结点
Binode* lmax = bt->lchild;//lmax记录左孩子下的最大结点
while (lmax->rchild != NULL)//通过循环找到左孩子下的最大结点
{
parent = parent->rchild;
lmax = lmax->rchild;
}
bt->data = lmax->data;//待删除结点数据域改为lmax数据域值
if (parent != bt)//判断是否执行了while循环/lmax是否右拐过
{
p = lmax;
parent->rchild = lmax->lchild;
free(p);
}
else//没有右拐,待删除结点左孩子为最大结点
{
p = lmax;
parent->lchild = lmax->lchild;
free(p);
}
}
}
//查找并删除功能函数,改进于排序二叉树查找函数
bool Searchdelete(Binode* root, int key)
{//空树或者找到最后左或者右子树为空
if (root == NULL)
return false;
else
{
if (root->data == key)
{
Deletenode(root, key);//找到目标结点进行删除,返回true
return true;
}
else if (root->data > key)
Searchdelete(root->lchild, key);
else
Searchdelete(root->rchild, key);
}
}
//测试
int main()
{
int a[] = { 10,45,42,63,58,55,90,70,67,83 };
Binode*root = Createbitree(a, 10);
if (Searchdelete(root, 90))
printf("\n删除成功");
else if(Searchdelete(root,90)==false)
printf("\n删除失败");
}
二叉树的结点删除算法实现
最新推荐文章于 2023-12-08 22:08:44 发布