树与森林基本概念(2)

1. 二叉排序树(左大右小)

你需要写一种数据结构,来维护一些数,其中需要提供以下操作:

  1. 插入数值 x。
  2. 删除数值 x。
  3. 输出数值 x 的前驱(前驱定义为现有所有数中小于 x 的最大的数)。
  4. 输出数值 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

e515c4894b38424eaa1dab9e7b82f3d3.png

95c34f6db9884b5b969f23b7f15591af.png
(2) 平衡因子: 一个结点的左子树的高度减去右子树的高度,可取-1、0、1三种值


3. 表达式树

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值