平衡二叉树的调整模版

 1 typedef struct avltreenode *avltree;
 2 typedef struct avltreenode{
 3     int data;
 4     avltree left;
 5     avltree right;
 6     int height;
 7 };
 8
 9 int getheight(avltree a)
10 {
11     if(a==NULL) return -1;
12     return a->height;
13 }
14
15 //a必须有一个左子结点b
16 //a与b做左单旋,更新a与b高度,返回新的根结点b
17 avltree singleleftrotation(avltree a)
18 {
19     avltree b=a->left;
20     a->left=b->right;
21     b->right=a;
22     a->height=max(getheight(a->left),getheight(a->right))+1;
23     b->height=max(getheight(b->left),a->height)+1;
24
25     return b;
26 }
27
28 //右单旋
29 avltree singlerightrotation(avltree a)
30 {
31     avltree b=a->right;
32     a->right=b->left;
33     b->left=a;
34
35     a->height=max(getheight(a->left),getheight(a->right))+1;
36     b->height=max(getheight(b->right),a->height)+1;
37
38     return b;
39 }
40
41 //左右双旋
42 //a必须有一个左子结点b,且b必须有一个右子结点c
43 //a,b,c,做两次单旋,返回新的根结点c
44 //先对b和c做右单旋,在对a和c做左单旋
45 avltree doubleleftrightrotation(avltree a)
46 {
47     a->left=singlerightrotation(a->left);
48
49     return singleleftrotation(a);
50 }
51
52 //右左双旋
53 avltree doublerightleftrotation(avltree a)
54 {
55     a->right=singleleftrotation(a->right);
56
57     return singlerightrotation(a);
58 }
59
60 avltree avl_insertion(int x,avltree t)
61 {
62     /*将X插入avl树T中,并返回调整后的avl树*/
63     if(!t)/*插入空树,则新建包含一个结点的树*/
64     {
65         t=(avltree)malloc(sizeof(struct avltreenode));
66         t->data=x;
67         t->height=0;
68         t->left=t->right=NULL;
69     }/*插入空树结束*/
70     else if(x<t->data)
71     {
72         t->left=avl_insertion(x,t->left);
73         if(getheight(t->left)-getheight(t->right)==2)
74         {
75             /*需要左旋*/
76             if(x<t->left->data)
77                 t=singleleftrotation(t);//左单旋 singleleftrotation
78             else
79                 t=doubleleftrightrotation(t);//左右双旋
80         }
81     }
82     else if(x>t->data)
83     {
84         t->right=avl_insertion(x,t->right);
85         if(getheight(t->left)-getheight(t->right)==-2)
86         {
87             /*需要右旋*/
88             if(x>t->right->data)
89                 t=singlerightrotation(t);//右单旋
90             else
91                 t=doublerightleftrotation(t);//右左双旋
92         }
93     }
94
95     //x=data,无须插入
96     t->height=max(getheight(t->left),getheight(t->right))+1;
97     return t;
98 }

例题:pat1066

代码:pat1066ac代码

时间: 2024-10-22 14:51:01

平衡二叉树的调整模版的相关文章

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

zbrush模版调控板介绍

今天小编来教大家认识zbrush模版调控板. ZBrush模版的作用象我们了解的所有绘制工具,通过它确定模版周围与涂画或模型的位置,下面是怎样使用默认的 “曲线板”模版或使用自定义形状: 1.打开Stencil(模版)调控版并激活模版,将出现默认的 “曲线板”. 2.使用StencilCoinController(模版铸造控制器)改变大小和位置. 3.通过模版或周围绘画或建模. 象Alpha,Stencil(模版)敏感于灰度值,即一个区域用50%灰度值允许在50%强度下绘画和雕塑. 自定义模版形

【数据结构】树与树的表示、二叉树存储结构及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树与哈夫曼编码、集合及其运算

1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找--方法一:顺序查找(时间复杂度O(n)) int SequentialSearch(St

二叉树、平衡二叉树、完全二叉树、满二叉树 .

基本概念 结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层. 二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度. 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用作二叉查找树和二叉堆.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的(i

2018京东校招Java笔试题

相比阿里巴巴,京东的题都是考研基础题,加上一点java基础知识和linux命令. 1. 单选题(19道题,每题2分): 1)4个并发进程都需要5个同类资源,则至少需要多少个资源,才不会导致死锁? 2)有一个user.txt文件,其中每行为一个user记录,用(sort,uniq,head,top,cat等命令组合)统计出现次数最多的3个user,及它们出现的次数. 3)序列13,18,24,35,47,50,63,83,90,115,124用二分法查找90,需要查找多少次? 4)A继承T,B继承

二叉搜索树以及对二叉搜索树平衡调整

代码的思想和图片参考:好大学慕课浙江大学陈越.何钦铭的<数据结构> 我们首先介绍一下什么是二叉搜索树和二叉平衡树: 二叉搜索树:一棵二叉树,可以为空:如果不为空,满足以下性质1. 非空左子树的所有键值小于其根结点的键值.2. 非空右子树的所有键值大于其根结点的键值.3. 左.右子树都是二叉搜索树. 二叉搜索树操作的特别函数:Position Find( ElementType X, BinTree BST ):从二叉搜索树BST中查找元素X,返回其所在结点的地址,查找的次数取决于树的高度  

查找算法总结

静态查找结构主要有两种:顺序查找.折半查找 一.顺序查找:这个就不用说了,一个一个的差吧,很差劲的算法了,时间复杂度是O(n) public int shunXuSearch( int[] b, int c) { for ( int i = 0; i < b. length; i++) { if (b[i] == c) { System. out.println( "查到了您想要的结果" + c + ",位置在:" + i); return i; } } Sy

ZBrush软件特性之Stencil模板调控板

在ZBrush中使用Stencil模板我们了解的所有绘图工具,通过它确定模板周围与涂画或模型的位置.本文将详解ZBrush?中如何使用"曲线板"自定义形状. 使用模版 ZBrush模版的作用象我们了解的所有绘制工具,通过它确定模版周围与涂画或模型的位置,下面是怎样使用默认的 "曲线板"模版或使用自定义形状: 1.打开Stencil(模版)调控版并激活模版,将出现默认的 "曲线板". 2.使用StencilCoinController(模版铸造控制

(转载)二叉树

基本概念 结点的层次(Level)从根开始定义,根为第一层,根的孩子为第二层. 二叉树的高度:树中结点的最大层次称为树的深度(Depth)或高度. 二叉树 在计算机科学中,二叉树是每个结点最多有两个子树的有序树.通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree).二叉树常被用作二叉查找树和二叉堆.二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒.二叉树的第i层至多有2的(i-1)次方个结点:深度为k的二