平衡二叉树的实现

简介: 平衡二叉树的实现

平衡二叉树是对排序二叉树的优化,在插入结点时有着很大的变化,需要调整树的高度达到平衡,下面是代码:

#include<iostream>
using namespace std;
struct node{
  int v,height; //height 记录高度 这里的高度是从下往上记 
  node *lchild,*rchild;
};
node* newnode(int x){   //生成一个新结点 
  node* r=new node;
  r->v=x;
  r->height=1;      //初始化高度为一 
  r->lchild=r->rchild=NULL;
  return r;
}
int getheight(node* root) {  // 得到当前结点的高度 
  if(root==NULL)return 0;
  return root->height;
}
int getfactor(node* root){  //得到平衡因子 
  return getheight(root->lchild)-getheight(root->rchild);
}
void updateheight(node* root) {  //更新结点当前高度 
root->height=max(getheight(root->lchild),getheight(root->rchild))+1;
  //左右子树较大者加一 
}
void search(node* root,int x) { // 查找操作不变 
  if(root==NULL){  //没有查到 
    printf("fail!\n");
    return;
  }
  if(root->v==x){ //查到 
    printf("succeed!");
    return;
  }
  if(root->v>x)search(root->lchild,x);
  else search(root->rchild,x);
}
//为实现插入操作的四个旋
void L(node* &root) {//左旋,root的右孩子当根 
  node* temp=root->rchild;
  root->rchild=temp->lchild; 
  temp->lchild=root; 
  //更新这两个结点高度 
  updateheight(root);
  updateheight(temp);
  root=temp;//改变根结点 
}
void R(node* &root) {//右旋,root的左孩子当根 
  node* temp=root->lchild;
  root->lchild=temp->rchild;
  temp->rchild=root; 
  updateheight(root);
  updateheight(temp);
  root=temp;
}
/*四种树形结论,看平衡因子 
根为2 左孩子为1,LL型      右旋解决 
      左孩子为 -1,LR型    先左孩子左旋后root右旋解决 
根为-2  右孩子-1,RR型   左旋解决 
        右孩子1,RL型    先右孩子右旋再root左旋解决
*/    
void insert(node* &root,int x){
  if(root==NULL){
  root=newnode(x);
  return; 
  }
  if(x<root->v) {
    insert(root->lchild,x);//往左子树插 
    updateheight(root);//更新高度
    if(getfactor(root)==2) {
      if(getfactor(root->lchild)==1)//LL型,右旋 
      R(root) ;
      else { //LR型,左右旋 
        L(root->lchild) ;
        R(root);
      }
    }
  }
  else{
    insert(root->rchild,x);//往右子树插 
    updateheight(root);//更新高度
    if(getfactor(root)==-2) {
      if(getfactor(root->rchild)==-1)//RR型,左旋 
      L(root) ;
      else { //RL型,右左旋 
        R(root->rchild) ;
        L(root);
      }
    }
  }
}
node * creating(int a[],int n){  //创建二叉树 
  node* root=NULL;
  for(int i=0;i<n;i++)
  insert(root,a[i]);
  return root;  
}
int main(){
  return 0;
} 

这里和排序二叉树的区别在于引入了高度好标记平衡因子,高度的更新操作比较重要,之后左、右旋,记录树形解决方法也是难点。

相关文章
|
Java 数据库连接 调度
面试题:用过线程池吗?如何自定义线程池?线程池的参数?
字节跳动面试题:用过线程池吗?如何自定义线程池?线程池的参数?
255 0
|
机器学习/深度学习 算法 搜索推荐
精确率(Precision)和召回率(Recall)
精确率(Precision)和召回率(Recall)是用于评估分类模型性能的指标。它们通常用于二分类问题,例如判断一个样本是正例(Positive)还是负例(Negative)。
7549 0
|
人工智能 算法 数据挖掘
【技术揭秘】解锁声纹技术中的说话人日志
说话人日志(speaker diarization)也叫说话人分离,它是从一个连续的多人说话的语音中切分出不同说话人的片段,并且判断出每个片段是哪个说话人的过程。借助说话人日志技术可以完成对音频数据流的结构化管理,具有广泛的应用价值,例如可以利用分离结果进行说话人自适应,以提高语音识别的准确率;可以辅助会议、电话数据进行自动转写构建说话人的音频档案;也可以利用说话人分离技术,实现语料库的自动跟踪和标注。
【技术揭秘】解锁声纹技术中的说话人日志
|
消息中间件 物联网 Java
开发者如何使用云消息队列 MQTT 版
【10月更文挑战第14天】开发者如何使用云消息队列 MQTT 版
924 108
|
11月前
|
存储 应用服务中间件 nginx
nginx反向代理bucket目录配置
该配置实现通过Nginx代理访问阿里云OSS存储桶中的图片资源。当用户访问代理域名下的图片URL(如 `http://代理域名/123.png`)时,Nginx会将请求转发到指定的OSS存储桶地址,并重写路径为 `/prod/files/2024/12/12/123.png`。
414 5
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
192 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
移动开发 前端开发 JavaScript
做前端技术方案选型的时候,你是怎么做决策的?
做前端技术方案选型的时候,你是怎么做决策的?
290 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的流浪动物管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的流浪动物管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
341 4
|
安全 区块链
DAPP公链合约系统开发技术原理丨DAPP公链合约系统开发详细源码及案例
智能合约dapp系统开发是基于链游技术开发的应用程序,它利用智能合约来实现去中心化的应用。智能合约是一种程序,它可以在链游上运行,根据指定的条件自动执行。智能合约dapp系统开发的核心在于智能合约的开发,智能合约的开发需要具备一定的链游技术知识和编程技能
|
存储 数据库 索引
B树与B+树区别
B树与B+树区别
3277 1