博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
搭建AVL树
阅读量:6479 次
发布时间:2019-06-23

本文共 3003 字,大约阅读时间需要 10 分钟。

#include
using namespace std;struct TreeNode{ int height; //每一个结点都要保存自己的高度 int data; TreeNode* leftC; TreeNode* rightC;};//得到此时结点高度int getHeight(TreeNode* s){ if (s != NULL) { return s->height; } return -1;}//右旋void rightRotate(TreeNode*& root){ TreeNode *l1 = root; TreeNode *l2 = root->leftC; l1->leftC = l2->rightC; l2->rightC = l1; l1->height = (getHeight(l1->leftC) > getHeight(l1->rightC) ? getHeight(l1->leftC) : getHeight(l1->rightC)) + 1; l2->height = (getHeight(l2->leftC) > getHeight(l2->rightC) ? getHeight(l2->leftC) : getHeight(l2->rightC)) + 1; root = l2;}//左旋void leftRotate(TreeNode*& root){ TreeNode *l1 = root; TreeNode *l2 = root->rightC; l1->rightC = l2->leftC; l2->leftC = l1; l1->height = (getHeight(l1->leftC) > getHeight(l1->rightC) ? getHeight(l1->leftC) : getHeight(l1->rightC)) + 1; l2->height = (getHeight(l2->leftC) > getHeight(l2->rightC) ? getHeight(l2->leftC) : getHeight(l2->rightC)) + 1; root = l2;}//左右,先左旋,再右旋void DoubleRotateLR(TreeNode* &n1){ leftRotate(n1->leftC); rightRotate(n1);}//右左,先右旋,后左旋void DoubleRotateRL(TreeNode* &n1){ rightRotate(n1->rightC); leftRotate(n1);}void Insert(TreeNode** node, int data){ if (*node == NULL) { TreeNode* tmp = new TreeNode(); tmp->data = data; tmp->height = 0; tmp->leftC = NULL; tmp->rightC = NULL; *node = tmp; return; } if ((*node)->data > data)//结点的值大于data { Insert(&((*node)->leftC), data);//不断插入 if ((getHeight((*node)->leftC) - getHeight((*node)->rightC)) == 2) {//说明需要右旋 if (data < (*node)->leftC->data) { rightRotate(*node); } else { DoubleRotateLR(*node); } } } else if ((*node)->data < data)//没有相同的值 { Insert(&((*node)->rightC), data); //如果高度之差为2的话就失去了平衡,需要旋转 if (2 == getHeight((*node)->rightC) - getHeight((*node)->leftC)) { if (data > (*node)->rightC->data) { leftRotate(*node); } else { DoubleRotateRL(*node); } } } (*node)->height = (getHeight((*node)->leftC) > getHeight((*node)->rightC) ? getHeight((*node)->leftC) : getHeight((*node)->rightC)) + 1;}void preOrder(TreeNode* node){ if (node == NULL) { return; } cout << node->data << " "; preOrder(node->leftC); preOrder(node->rightC);}void inOrderTraversal(TreeNode* root){ if(root) { inOrderTraversal(root->leftC); cout << root->data << " "; inOrderTraversal(root->rightC); }}int main(){ int n; cin>>n; while(n-->0) { int num; cin>>num; TreeNode *head=NULL; int point; for(int i=0;i
>point; Insert(&head, point); } preOrder(head); cout<

  

转载于:https://www.cnblogs.com/KennyRom/p/6209488.html

你可能感兴趣的文章
Matlab编程之——卷积神经网络CNN代码解析
查看>>
白洋淀周末游
查看>>
三篇文章了解 TiDB 技术内幕 —— 说计算
查看>>
copy strong weak assign的区别
查看>>
OpenCV 入门
查看>>
css 3D transform变换
查看>>
ele表格合并行之后的selection选中
查看>>
正则表达式分解剖析(一文悟透正则表达式)
查看>>
解决UILable标点符号居中的问题
查看>>
HTML5新特性教程
查看>>
ImageOptim-无损图片压缩Mac版
查看>>
12 Go语言map底层浅析
查看>>
vue-resumer 项目中 element-ui 遇到的 textarea autosize 问题
查看>>
以主干开发作为持续交付的基础
查看>>
PHP扩展库PEAR被攻击,近半年下载者或被影响
查看>>
传统运维团队转型应该注意哪些问题?
查看>>
JavaScript函数(二)
查看>>
Airbnb改进部署管道安全性,规范部署顺序
查看>>
腾讯最大规模裁撤中层干部,让贤年轻人
查看>>
当我们谈性能的时候,我们实际上在谈什么?
查看>>