数据结构—平衡二叉树

原理:参考趣学数据结构

代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct avlTree {int data;struct avlTree *lchild, *rchild;int height;
}avlTree;int height(avlTree* AVLTree);//声明avl树的深度
void updateHeight(avlTree* &AVLTree);//声明更新avl树每个结点的高度avlTree* LL(avlTree* &AVLTree) {//单向右旋avlTree* temp = AVLTree->lchild;AVLTree->lchild = temp->rchild;temp->rchild = AVLTree;updateHeight(temp);//更新avl树的高度updateHeight(AVLTree);return temp;
}
avlTree* RR(avlTree* &AVLTree) {//单向左旋avlTree* temp = AVLTree->rchild;AVLTree->rchild=temp->lchild;temp->lchild = AVLTree;updateHeight(temp);//更新avl树的高度updateHeight(AVLTree);//调整顺序的两个节点都要更新高度return temp;
}
avlTree* LR(avlTree* &AVLTree) {//先右后左双向旋转AVLTree->lchild=RR(AVLTree->lchild);return LL(AVLTree);
}
avlTree* RL(avlTree* &AVLTree) {//先左后右双向旋转AVLTree->rchild = LL(AVLTree->rchild);return RR(AVLTree);
}
int height(avlTree* AVLTree) {//计算树的高度int m, n;if (!AVLTree) {return 0;}else {m = height(AVLTree->lchild);//左子树深度n = height(AVLTree->rchild);//右子树深度if (m > n) {return m + 1;}else {return n + 1;}}
}
void updateHeight(avlTree* &AVLTree) {//更新每个结点的高度值if (AVLTree) {AVLTree->height = height(AVLTree);updateHeight(AVLTree->lchild);updateHeight(AVLTree->rchild);}
}
avlTree* insertAVLTree(avlTree* &AVLTree,int e) {//插入一个结点if (!AVLTree) {//如果为空树,生成一个新的结点AVLTree = (avlTree*)malloc(sizeof(avlTree));AVLTree->data = e;AVLTree->lchild = AVLTree->rchild = NULL;//不能写成二个都是左指针AVLTree->height = 1;return AVLTree;}else {//查找元素要插入的位置if (AVLTree->data == e) {printf("已经存在元素%d,不需要插入\n", e);return AVLTree;//结束}if (e < AVLTree->data) {AVLTree->lchild = insertAVLTree(AVLTree->lchild, e);//插入左边if (height(AVLTree->lchild) - height(AVLTree->rchild) == 2) {if (e > AVLTree->lchild->data) {AVLTree =LR(AVLTree);//一定要有返回值覆盖}else {AVLTree =LL(AVLTree);}}}else {AVLTree->rchild = insertAVLTree(AVLTree->rchild, e);//插入右边if (height(AVLTree->rchild) - height(AVLTree->lchild) == 2) {if (AVLTree->rchild->data > e) {AVLTree =RL(AVLTree);}else {AVLTree =RR(AVLTree);}}}}updateHeight(AVLTree);//更新AVL每个结点的高度return AVLTree;
}
void prePrint(avlTree*  T) {//前序遍历AVLif (T) {printf("%d ", T->data);prePrint(T->lchild);prePrint(T->rchild);}
}
int main() {avlTree* T = NULL;//一定要初始化为空树int count, data;printf("开始构造avl:\n输入avl结点的数目:");scanf_s("%d", &count);int counts = 0;while (count--) {//构造avlcounts += 1;printf("输入avl的第%d个结点:", counts);scanf_s("%d", &data);insertAVLTree(T, data);}printf("前序遍历avl\n");prePrint(T);//前序遍历avlprintf("\n");system("pause");return 0;
}

测试截图:

时间复杂度O(logn),空间复杂度O(1)

如果存在什么问题,欢迎批评指正!谢谢!

数据结构---平衡二叉树相关推荐

  1. 用c语言编译二叉树,C语言 数据结构平衡二叉树实例详解

    数据结构平衡二叉树 参考代码如下: /* 名称:平衡二叉树 语言:数据结构C语言版 编译环境:VC++ 6.0 日期: 2014-3-26 */ #include #include #include ...

  2. 数据结构——平衡二叉树的的旋转问题

    在学习有关数据结构平衡二叉树的时候,我就特别困惑在二叉查找树中是如何将树旋转和交换孩子的.这里,我将自己的总结写下来,喜欢大家一起交流进步!        这个需要旋转的情况大体可以·分为4种情况.分 ...

  3. 数据结构-平衡二叉树(AVL树)

    目录 1,平衡二叉树的介绍 1.1,二叉排序树存在的问题 1.2,平衡二叉树 1.3,平衡二叉树的创建 1.4,平衡二叉树的查找 2,代码实现 2.1,平衡二叉树的节点类型 2.2,LL旋转(单右旋转 ...

  4. 数据结构 — 平衡二叉树

    目录 文章目录 目录 平衡二叉树 平衡二叉树 平衡二叉查找树具有如下性质: 若左子树不空,则左子树上所有节点的值均小于它的根节点的值: 若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值: ...

  5. 数据结构 - 平衡二叉树

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 平衡二叉 ...

  6. 浅谈数据结构-平衡二叉树

    平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵 ...

  7. 数据结构——平衡二叉树

    一.平衡二叉树的定义 平衡二叉树(AVL 树)仍然是一棵二叉查找树,只是在其基础上增加了"平衡"的要求.所谓平衡是指,对 AVL 树的任意结点来说,其左子树与右子树的高度之差的绝对 ...

  8. 数据结构 平衡二叉树avl c++

    平衡二叉树:一颗空树,或者是具有以下性质的二叉树 左子树和右子树都是平衡二叉树 左子树和右子树的深度只差不超过1 把二叉树节点的平衡因子BF(Balance Factor)定义为该节点的左子树深度减去 ...

  9. [ 数据结构 ] 平衡二叉树(AVL)--------左旋、右旋、双旋

    0 引出 数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST), 并分析问题所在 回顾:二叉搜索树 左子树全部为空,从形式上看,更像一个单链表. 插入速度没有影响 查询速度明显降低(因为需 ...

最新文章

  1. dedecms织梦获得首字母或拼音的方法,并实现文章列表按首字母归类
  2. php对象和数组的效率,PHP对象数组和一般数组区别
  3. linux内核之accept实现
  4. linux tcp 包大小,linux – 通过大量连接和小数据包流量高的千兆网络提高TCP性能...
  5. 机器学习基础——实现基本的决策树
  6. WEB前端 前端开发者 如何突破技术瓶颈
  7. 基本SQL命令-您应该知道的数据库查询和语句列表
  8. Seata多微服务互相调用_全局分布式事务使用案例_seata之原理剖析---微服务升级_SpringCloud Alibaba工作笔记0066
  9. C#多线程之线程池篇2
  10. 手把手教程 Sublime Text 删除重复行
  11. Multisim软件实验
  12. linux离线安装系统工具arping
  13. 为什么要学计算机演讲稿,我们为什么要学习科学演讲稿
  14. 人居一世间, 忽若风吹尘 2019.07.07.
  15. MySQL入门笔记整理
  16. Android初学之------Android Studio 运行java程序
  17. CH13,拍42,练习一。通过文本文件统计页面访问量
  18. java继承求5个圆柱体积_编写Javat程序,计算并输出一个半径为10.5,高为20的圆柱体的体积。...
  19. 电脑任务栏桌面图标透明紊乱解决方法
  20. 芯片检测(分治法经典问题)

热门文章

  1. C语言宏使用常见问题
  2. java.io.StreamCorruptedException: invalid type code: AC解决办法
  3. Nginx指南和配置详解
  4. xhr get获取文件流下载文件_python爬虫实战——豆瓣电影get初体验
  5. python中匿名函数的作用_什么是Python中的匿名函数
  6. 计算机组成原理xchg,8088数据传送指令-计算机组成原理与汇编语言-电子发烧友网站...
  7. linux系统做的小游戏,2007最新 100个Linux系统上的小游戏汇集
  8. ​如何在图书馆收获一段爱情?​
  9. 当女朋友问你会不会出轨的时候,该怎么回答?
  10. 清华博士生放弃科研,跑去当中学教师,值得吗?