#include<iostream>
using namespace std;
struct TreeNode {
int value;
TreeNode* left;
TreeNode* right;
};
TreeNode* Insert(TreeNode *T,int e)
{
if (!T)
{
T = new TreeNode;
T->left = nullptr;
T->right = nullptr;
T->value = e;
}
else if (T->value > e)
T->left = Insert(T->left, e);
else if (T->value < e)
T->right = Insert(T->right, e);
return T;
}
void Delete(TreeNode *T)
{
if (!T->left)
{
if (!T->right)
{
delete T;
}
else
{
T->value=T->right->value;
TreeNode *p = T->right;
T->left = T->right->left;
T->right = T->right->right;
delete p;
}
}
else if (!T->right)
{
if (!T->left)
{
delete T;
}
else
{
T->value = T->left->value;
TreeNode *p = T->left;
T->left = T->right->left;
T->right = T->right->right;
delete p;
}
}
else
{
TreeNode *s = T->left;
TreeNode *p = s;
while (s->right)
{
p = s;
s = s->right;
}
if (p == s)
{
T->value = s->value;
T->left = s->left;
delete s;
}
else
{
T->value = s->value;
p->right = s->left;
delete s;
}
}
}
void Deleteval(TreeNode* T, int e)
{
if (T == nullptr)
cout << "删除节点失败" << endl;
if (T->value == e)
{
Delete(T);
cout << "删除节点" << e << "成功" << endl;
}
else if (e < T->value)
Deleteval(T->left, e);
else if (e > T->value)
Deleteval(T->right, e);
}
void Destory(TreeNode* T)
{
if (T)
{
Destory(T->left);
Destory(T->right);
delete T;
}
}
void Inorder(TreeNode* T)
{
if (T)
{
Inorder(T->left);
cout << T->value << " ";
Inorder(T->right);
}
}
int main()
{
TreeNode* T = nullptr;//1
int a[9] = { 100,999,88,120,9130,3,43,56,78 };
for (int i = 0; i < 9; ++i)
{
T=Insert(T, a[i]);
}
Inorder(T);
Deleteval(T, 999);
Deleteval(T, 56);
cout << endl;
Inorder(T);
Destory(T);
return 0;
}