二叉树的基本操作
1:二叉树的创建(插入数据)
2:二叉树的删除
3:二叉树的查找(两种)
4:二叉树的释放内存
#include <iostream>
using namespace std;
typedef struct node
{
int data;
node *lchild;//左孩子
node *rchild;//右孩子
node ()//初始化左右孩子节点
{
lchild = NULL;
rchild = NULL;
}
} BSTnode;
bool InsertBST(BSTnode * &T, int data)//插入data数据由于需要修改T值所以需要用引用
{
if (T == NULL)//如果为空说明已经遍历到叶子节点处添加我们的数据就ok了
{
BSTnode *newnode = new BSTnode;
newnode->data = data;
T = newnode;
return true;
}
if (T->data > data)//如果小于T的值说明插入的数据在数的左边
{
return InsertBST(T->lchild, data);//递归查找
}
if (T->data < data)//如果大于T的值说明插入的数据在数的右边
{
return InsertBST(T->rchild, data);
}
return false;
}
BSTnode* CreatBST(int *arr, int n)//为数组创建二叉树返回根节点
{
int i;
BSTnode *T = NULL;
for (i = 0; i< n; i++)
{
InsertBST(T, arr[i]);
}
return T;
}
BSTnode* SearchBST(BSTnode *T, int data)//在以T为根节点的树中进行查找
{
if (T == NULL || T->data == data)//找到data或者遍历完也没有查找到
{
return T;
}
//左右子数递归查找
if (T->data > data)
{
return SearchBST(T->lchild, data);
}
if (T->data < data)
{
return SearchBST(T->rchild, data);
}
}
BSTnode* SearchBST1(BSTnode *T, int data, BSTnode *temp, BSTnode * &f)//查找data并且返回data的指针和父节点指针temp临时变量
{
if (T == NULL)//和searchbst的区别即使查到data的数据T也可能为空
{
f = NULL;
return NULL;
}
if (T->data == data)
{
f = temp;
return T;
}
if (T->data > data)
{
return SearchBST1(T->lchild, data, T, f);
}
if (T->data < data)
{
return SearchBST1(T->rchild, data, T, f);
}
}
void showBST(BSTnode *T)//打印二叉树
{
if (T== NULL)
{
return ;
}
showBST(T->lchild);
cout<< T->data<<endl;
showBST(T->rchild);
}
BSTnode* maxnum(BSTnode *T, BSTnode *temp, BSTnode *&parents)//查找以T为根节点的树的最大值并返回指针
{
if (T == NULL || T->rchild == NULL)
{
parents = temp;
return T;
}
return maxnum(T->rchild, T, parents);
}
BSTnode* minnum(BSTnode *T, BSTnode *temp, BSTnode *&parents)//查找以T为根节点的树的最小值并返回指针
{
if (T == NULL || T->lchild == NULL)
{
parents = temp;
return T;
}
return minnum(T->lchild, T, parents);
}
void ClearBST(BSTnode *T)//销毁二叉树释放内存
{
if (T == NULL)
{
return ;
}
ClearBST(T->lchild);
ClearBST(T->rchild);
delete T;
}
bool deleteBST(BSTnode *&T, int data)//删除以T为根节点的二叉树中data数据
{
BSTnode *p, *q, *r, *parents, *leafparents, *leaf;
p = SearchBST1(T, data, NULL, parents);//查找data的指针和父节点指针
if (p == NULL)//如果二叉树中没有data数据返回false
{
return false;
}
leaf = minnum(p->rchild, p,leafparents);//取得删除数据右子树中最小值并返回指针和父节点指针
if (leaf != NULL)
{
p->data = leaf->data;
if (p == leafparents)//假如父节点指针和删除节点一样则如下
{
leafparents->rchild = leaf->rchild;
}
else
{
leafparents->lchild = leaf->rchild;
}
delete leaf;
leaf = NULL;
return true;
}
//如果右子树为空则在左子树中执行上面的操作
leaf = maxnum(p->lchild, p,leafparents);
if (leaf != NULL)
{
p->data = leaf->data;
if (p == leafparents)
{
leafparents->lchild = leaf->lchild;
}
else
{
leafparents->lchild = leaf->rchild;
}
delete leaf;
leaf = NULL;
return true;
}
if (parents->lchild == p)//如果查找到的节点没有左右子节点则执行下面的
{
parents->lchild = NULL;
}
else
{
parents->rchild = NULL;
}
delete p;
p = NULL;
}
int main()
{
int n, i;
int *a;
cin >> n;
a = new int[n+1];
for (i = 0; i< n; i++)
{
cin >> a[i];
}
BSTnode *T = CreatBST(a, n);
while (cin >> i)
{
deleteBST(T, i);
showBST(T);
}
delete[]a;
ClearBST(T);
return 0;
}