题目描述
代码实现
#include<iostream>
using namespace std;
struct Node
{
int key;
Node* left = NULL, * right = NULL, *parent = NULL;
};
class BST
{
private:
Node* root;
public:
BST();
void insertBST(Node*& temp, int key);
void DeleteBST(int key);
void Inorder(Node* temp);
void DeleteShow();
Node* search(int key);
};
BST::BST()
{
root = NULL;
int length, key;
cin >> length;
while (length--)
{
cin >> key;
insertBST(root, key);
}
}
void BST::insertBST(Node*& temp, int key)
{
if (temp == NULL)
{
Node* node = new Node;
node->key = key;
node->left = NULL;
node->right = NULL;
node->parent = NULL;
temp = node;
}
else
{
if (key < temp->key)
{
insertBST(temp->left, key);
if (temp->left) temp->left->parent = temp;
}
else
{
insertBST(temp->right, key);
if (temp->right) temp->right->parent = temp;
}
}
}
void BST::Inorder(Node* temp)
{
if (temp)
{
Inorder(temp->left);
cout << temp->key << " ";
Inorder(temp->right);
}
}
void BST::DeleteShow()
{
Inorder(root);
cout << endl;
int count, deNum;
cin >> count;
while (count--)
{
cin >> deNum;
DeleteBST(deNum);
Inorder(root);
cout << endl;
}
}
void BST::DeleteBST(int key)
{
Node* temp = search(key);//找到那个节点
if (temp == NULL);//不作操作
//开始讨论
else if (temp->left == NULL && temp->right == NULL)//叶子节点
{
if (temp->parent == NULL)//根节点特殊判断
root = NULL;
else if (temp->parent->left == temp)//是左节点
{
temp->parent->left = NULL;
//delete temp;
}
else//是右节点
{
temp->parent->right = NULL;
//delete temp;
}
//delete temp;//删除
}
else if (temp->right && temp->left == NULL)//有右孩子节点
{
if (temp->parent == NULL)//根节点特殊判断
{
temp->right->parent = NULL;
root = temp->right;
delete temp;
}
else if (temp->parent->left == temp)
{
temp->right->parent = temp->parent;//修改父节点
temp->parent->left = temp->right;
delete temp;
}
else
{
temp->right->parent = temp->parent;//修改父节点
temp->parent->right = temp->right;
delete temp;
}
}
else if (temp->left && temp->right == NULL)//有左孩子节点
{
if (temp->parent == NULL)//根节点特殊判断
{
temp->left->parent = NULL;
root = temp->left;
delete temp;
}
else if (temp->parent->left == temp)
{
temp->left->parent = temp->parent;//修改父节点
temp->parent->left = temp->left;
delete temp;
}
else
{
temp->left->parent = temp->parent;//修改父节点
temp->parent->right = temp->left;
delete temp;
}
}
else//既有左孩子又有右孩子
{
//找到前驱(左孩子的最大,右孩子的最小)
Node* node = temp->left;
while (node->right)
node = node->right;
temp->key = node->key;//替换掉,然后删掉前驱节点
if (node->left)//有左孩子
{
if (node->parent->left == node)
{
node->left->parent = node->parent;
node->parent->left = node->left;
delete node;
}
else
{
node->left->parent = node->parent;
node->parent->right = node->left;
delete node;
}
}
else//叶子节点,左右孩子都没有
{
if (node->parent->left == node)
{
node->parent->left = NULL;
delete node;
}
else
{
node->parent->right = NULL;
delete node;
}
}
}
}
Node* BST::search(int key)
{
Node* temp = root;
while (1)
{
if (temp == NULL)//说明没有找到
return temp;
if (temp->key == key)//找到了
return temp;
if (key < temp->key)
temp = temp->left;
else if (key > temp->key)
temp = temp->right;
}
}
int main(void)
{
int n;
cin >> n;
while (n--)
{
BST bst;
bst.DeleteShow();
}
return 0;
}