二叉排序树
作者:
zzu
,
2024-04-22 21:04:02
,
所有人可见
,
阅读 2
#include <iostream>
using namespace std;
struct TreeNode
{
int val;
TreeNode *right, *left;
TreeNode(int _val): val(_val), left(NULL), right(NULL){}
}*root;
void insert(TreeNode* &root, int x)
{
if(!root) root = new TreeNode(x);
else if(x < root->val) insert(root->left, x);
else insert(root->right, x);
}
void remove(TreeNode* &root, int x)
{
if(!root) return;// 本题无需判断
if(x > root->val) remove(root->right, x);//在右子树删
else if(x < root->val) remove(root->left, x);//在左子树删
else
{
if(!root->right && !root->left) root = NULL;//没有左二子和右二子
else if(!root->left) root = root->right;// 么有左儿子
else if(!root->right) root = root->left;// 没有右二子
else//有左和右二子
{
auto p = root->left;//在左子树中找到其中序中的前趋
while(p->right) p = p->right;//找到其中序中的前趋
root->val = p->val;//覆盖
remove(root->left, p->val); //删除前趋
}
}
}
void Search(TreeNode *root, int x)
{
if(!root) return;
if(root->val == x) cout << "Search success!" << endl;
else if(root->val < x) Search(root->right, x);
else Search(root->left, x);
}
int main()
{
int n, x, t;
cin >> n;
while(n --)
{
cin >> t >> x;
if(t == 1) insert(root, x);
else if(t == 2) remove(root, x);
else if(t == 3) Search(root, x);
}
}