Date: 2019-04-11 18:49:18

AVL树的基本操作

 //存储结构
struct node
{
int data;
int height; //记录当前子树的高度(叶子->根)
//存储平衡因子的话,无法通过其子树算得该树的平衡因子
node *lchild, *rchild;
}; //新建结点
node *newNode(int v)
{
node *root = new node;
root->data = v;
root->height = ;
root->lchild = root->rchild = NULL;
return root;
} //获取当前结点所在高度
int GetHeight(node *root)
{
if(root == NULL)
return ;
return root->height;
} //计算结点的平衡因子
int GetBalanceFactors(node *root)
{
return GetHeight(root->lchild)-GetHeight(root->rchild);
} //更新结点高度
void UpdataHeight(node *root)
{
root->height = max(GetHeight(root->lchild), GetHeight(root->rchild))+;
} //查找
void Search(node *root, int x)
{
if(root == NULL)
return;
if(x == root->data)
//visit
else if(x < root->data)
Search(root->lchild, x);
else
Search(root->rchild, x);
} //左右旋互为逆操作
//左旋
void LeftRotation(node *&root)
{
node *temp = root->lchild; //temp指向新的根结点B
root->rchild = temp->lchild; //B的左子树给A的右子树
temp->lchild = root; //B的左子树变为A
UpdataHeight(root); //更新结点高度
UpdataHeight(temp);
root = temp; //令B成为新的根结点
} //右旋
void RightRotation(node *&root)
{
node *temp = root->lchild;
root->lchild = temp->rchild;
temp->rchild = root;
UpdataHeight(root);
UpdataHeight(temp);
root = temp;
} /*
1.LL: A==+2, A->lchild=+1
A作为root进行右旋
2.LR: A==+2, A->lchild=-1
A->lchild作为root进行左旋 --> 转化为LL
A作为root进行右旋
3.RR: A==-2, A->rchild=-1
A作为root进行左旋
4.RL: A==-2, A->rchild=+1
A->rchild作为root进行右旋 --> 转化为RR
A作为root进行左旋
*/ //插入
void Insert(node *&root, int v)
{
if(root == NULL)
{
root = newNode(v);
return;
}
if(v < root->data)
{
Insert(root->lchild, v);
UpdataHeight(root); //更新树高
if(GetBalanceFactor(root) == )
{
if(GetBalanceFactor(root->lchild) == )
RightRotation(root);
else
{
LeftRotation(root->lchild);
RightRotation(root);
}
}
}
else
{
Insert(root->rchild, v);
UpdataHeight(root);
if(GetBalanceFactor(root) == -)
{
if(GetBalanceFactor(root->rchild) == -)
LeftRotation(root);
else
{
RightRotation(root->rchild);
LeftRotation(root);
}
}
}
} //建立
node *Create(int data[], int n)
{
node *root = NULL;
for(int i=; i<n; i++)
Insert(root, data[i]);
return root;
}

判断一棵树是否为AVL树

 #include <cstdio>
const int M = ;
int pre[M]={,,,,,,,,,};
int in[M]={,,,,,,,,,};
struct node
{
int data;
node *lchild, *rchild;
}; node *Create(int preL, int preR, int inL, int inR)
{
if(preL > preR)
return NULL;
node *root = new node;
root->data = pre[preL];
int k;
for(k=inL; k<=inR; k++)
if(in[k] == root->data)
break;
int numLeft = k-inL;
root->lchild = Create(preL+, preL+numLeft, inL, k-);
root->rchild = Create(preL+numLeft+, preR, k+, inR);
} int IsAvl = true;
int IsAVL(node *root)
{
if(root == NULL)
return -;
int bl = IsAVL(root->lchild)+;
int br = IsAVL(root->rchild)+;
if(bl-br> || bl-br<-)
IsAvl = false;
return bl>br?bl:br;
} int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("Test.txt", "r", stdin);
#endif node *root = Create(,M-,,M-);
IsAVL(root);
if(IsAvl)
printf("Yes.");
else
printf("No."); return ;
}

最新文章

  1. SI与EMI(一) - 反射是怎样影响EMI
  2. 《java数据结构和算法》读书笔记
  3. Java中的序列化Serialable高级详解
  4. Android学习笔记(十一)——ListView的使用(下)
  5. Centos环境下部署游戏服务器-权限
  6. jQuery截取字符串插件区分中英文
  7. Java 异常处理的误区和经验总结--转载
  8. android listview Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
  9. [译]Java内存泄露介绍
  10. C# 语言规范_版本5.0 (第20章 附录B_语法)
  11. abap 一些小知识点的总结
  12. Ubuntu server搭建Java web服务器
  13. PHP 对象数组和一般的数组的相互转化
  14. Ceres Solver 在win8+vs2013环境下的安装
  15. (转)android 中uri.parse()用法
  16. Linux学习历程——Centos 7 man命令
  17. 【转】Linux C下非特定波特率的配置和使用
  18. 明天软软onsite
  19. php 处理上百万条的数据库如何提高处理查询速度
  20. Python高级正则

热门文章

  1. iOS:如何让xib同时兼容支持iOS6和iOS7
  2. Codeforces Round #250 Div. 2(C.The Child and Toy)
  3. 解决国内android sdk无法更新,google不能的简单办法
  4. 严格符合CommonJS规范的包特性
  5. bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP
  6. 267C
  7. 第16课 “远程 Git文档库” 的基础操作
  8. HTTP权威协议笔记-8.集成点:网关、隧道及中继
  9. Shuffle&#39;m Up(串)
  10. Watchcow(欧拉回路)