1. 二叉排序树(左大右小)
你需要写一种数据结构,来维护一些数,其中需要提供以下操作:
- 插入数值 x。
- 删除数值 x。
- 输出数值 x 的前驱(前驱定义为现有所有数中小于 x 的最大的数)。
- 输出数值 x 的后继(后继定义为现有所有数中大于 x 的最小的数)。
题目保证:
- 操作 11 插入的数值各不相同。
- 操作 22 删除的数值一定存在。
- 操作 33 和 44 的结果一定存在。
输入格式
第一行包含整数 n,表示共有 n 个操作命令。
接下来 n 行,每行包含两个整数 opt 和 x,表示操作序号和操作数值。
输出格式
对于操作 3,43,4,每行输出一个操作结果。
#include<iostream>
#include<algorithm>
using namespace std;
int INF=1e8;
struct TreeNode
{
int val;
TreeNode *left,*right;
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->right,x);
else insert(root->left,x);
}
void remove(TreeNode *&root,int x)
{
if(!root)return ;
if(x<root->val)remove(root->left,x);
else if(x>root->val)remove(root->right,x);
else
{
if(!root->left&&!root->right)root=NULL;
else if(!root->right)root=root->left;
else if(!root->left)root=root->right;
else
{
auto p=root->left;
while(p->right)p=p->right;
root->val=p->val;
remove(root->left,p->val);
}
}
}
int get_pre(TreeNode* root ,int x)
{
if(!root)return -INF;
if(root->val>=x)return get_pre(root->left,x);
return max(root->val,get_pre(root->right,x));
}
int get_suc(TreeNode* root ,int x)
{
if(!root)return INF;
if(root->val<=x)return get_suc(root->right,x);
return min(root->val,get_suc(root->left,x));
}
int main()
{
int n;
cin>>n;
while(n--)
{
int t,x;
cin>>t>>x;
if(t==1)insert(root,x);
else if(t==2)remove(root,x);
else if(t==3)cout<<get_pre(root,x)<<endl;
else cout<<get_suc(root,x)<<endl;
}
}
2. 平衡树—AVL
(1) 定义: 满足如下条件的树:
a. 是二叉查找树
b. 每个节点的左子树和右子树的高度差最多为1
(2) 平衡因子: 一个结点的左子树的高度减去右子树的高度,可取-1、0、1三种值
3. 表达式树