手把手教你写平衡二叉树

因为上BST课的时候睡觉睡过了结果。。。,后者折腾了一个下午才写了出来,感谢http://blog.chinaunix.net/uid-24948645-id-3913917.html博客的详细解析,但是上面的不足之处在于代码是伪代码,基本实现不了,然后自己做了修改,改成c++的写法。

AVL树平衡二叉树数据结构

AVL树是最先发明的自平衡二叉查找算法,是平衡二叉树的一种。在AVL中任何节点的两个儿子子树的高度最大差别为1,所以它又被成为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来平衡这棵树。

假设把AVL树构造过程中需要重新平衡的节点叫做α。由于任意节点最多有两个儿子,因此高度不平衡时,α点的两颗子树的高度差2。这种不平衡可能出现在下面这四种情况:

1)  对α的左儿子的左子树进行一次插入(右旋)

其中D是新插入的节点,红色节点K2是失去平衡的节点。需要对K1和K2进行左旋调整即将K1作为根,将K2作为K1的左子树,K1的右子树调整为K2的左子树。如下图所示

进行右旋变换   

node* L_Ratate(node *K2)  //左旋
{node *K1;K1 = K2->Left;K2->Left = K1->Right;K1->Right = K2;//更新节点的高度return K1;
}

2)对α的右儿子的右子树进行一次插入(左旋)

将K2的右子树更改为K1的左子树,K1的左子树更改为K2即完成的右旋,如下图所示

进行左


node* R_Ratate(node* K2)
{node* K1;K1 = K2->Right;K2->Right = K1->Left;K1->Left = K2;//更新节点高度return K1;
}

3)对α的右儿子的左子树进行一次插入(右左双旋)

右左双旋:先对K1和K2进行左旋,然后在对K2和K3进行右旋,最终实现平衡。如下图所示

进行一次右旋进行一次左旋

node* DoubleL_Rotate(node* K3)//双向旋转(左右)
{K3->Left = R_Ratate(K3->Left);return L_Ratate(K3);
}

4)对α的左儿子的右子树进行一次插入(左右双旋)

左右双旋这里的左右指的是对α的左儿子的右子树进行插入时需要旋转。先对K1和K2进行右旋(跟第四种情况类似),然后再对K3和K2进行左旋,最终实现平衡。如下图所示

进行一次左旋进行一次右旋


node* DoubleR_Rotate(node* K3)//双向旋转(右左)
{K3->Right = L_Ratate(K3->Right);return R_Ratate(K3);
}

完整代码:

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct Node
{int data;int bf;//用来表示平衡因子struct Node *Left,*Right;
} node;
node* L_Ratate(node *K2)  //左旋
{node *K1;K1 = K2->Left;K2->Left = K1->Right;K1->Right = K2;//更新节点的高度return K1;
}
node* R_Ratate(node* K2)
{node* K1;K1 = K2->Right;K2->Right = K1->Left;K1->Left = K2;//更新节点高度return K1;
}
node* DoubleL_Rotate(node* K3)//双向旋转(左右)
{K3->Left = R_Ratate(K3->Left);return L_Ratate(K3);
}
node* DoubleR_Rotate(node* K3)//双向旋转(右左)
{K3->Right = L_Ratate(K3->Right);return R_Ratate(K3);
}
int Height(node* P)
{if(P == NULL)return -1; //当构建根节点,或者是叶子节点的时候为-1+1正好为0elsereturn P->bf;
}node* create_bst(node* bst,int x)
{//cout<<"ok\n";if(!bst){//cout<<"ok\n";bst=new node;bst->data=x;bst->bf=0;bst->Left=bst->Right=NULL;}else if(x<bst->data){bst->Left=create_bst(bst->Left,x);if(Height(bst->Left)-Height(bst->Right)==2)//左子树插入节点所以高度是左子树高于右子树{if(x<bst->Left->data)//对α的左儿子的左子树进行一次插入,需要左旋bst=L_Ratate(bst);else//对α的左儿子的右子树进行一次插入,需要双旋bst=DoubleL_Rotate(bst);}}else if(x>bst->data)//右子树插入新节点{bst->Right = create_bst(bst->Right,x);if(Height(bst->Right) - Height(bst->Left)== 2)//因为是右子树插入新节点,所以高度是右子树高于左子树{if(x > bst->Right->data)//对α的右儿子的右子树进行一次插入,需要右旋bst = R_Ratate(bst);else//对α的右儿子的左子树进行一次插入,需要双旋bst = DoubleR_Rotate(bst);}}bst->bf = max(Height(bst->Left), Height(bst->Right)) + 1;//cout<<"test="<<bst->bf<<endl;return bst;
}
void InOrder(node* bst)
{if(!bst)return;else{InOrder(bst->Left);cout<<bst->data<<' '<<endl;InOrder(bst->Right);}
}
int main()
{int n;cout<<"请输入要构建的二叉平衡树序列长度"<<endl;cin>>n;cout<<"请输入要构建的二叉平衡树序列"<<endl;node *bst=NULL;for(int i=0; i<n; ++i){int d;cin>>d;bst=create_bst(bst,d);}cout<<"....输出...."<<endl;InOrder(bst);return 0;
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视觉算法算法

https://github.com/rayryeng/XiaohuLuVPDetection https://xiaohulugo.github.io/papers/Vanishing_Point_Detection_WACV2017.pdf 三维重建 http://staff.ustc.edu.cn/~lgliu/ pnp问题&#xff1a; https://github.com/ydsf16/PnP_Solver slam文章&#xff1a; https:/…

CDH - 启动HbaseMaster时异常

测试环境 CDH,启动HbaseMaster时&#xff0c;启动失败&#xff0c;提示无法split WALs目录下的数据。 解决方法&#xff1a;删除WALs里的数据解决该问题&#xff08;数据如不可恢复勿用该方法&#xff09;&#xff0c;重启成功 2018-09-14 14:43:07,254 WARN org.apache.hado…

HTML之标签

2.3.1标签1.开始标签<html> </html> 表示html的开始<head> </head> 描述html文档的相关信息&#xff0c;之间的内容是不会在浏览器的框内显示出来的<body> </body> 在浏览器中显示主要内容&#xff0c;也是html文件的主要部分。2.单独出现…

cuda编程性能 分析工具 nvprof的使用

ubuntu环境上&#xff0c;安装cuda,会自动安装一些工具nvcc ,nvprof nvcc-gdb.... 1.编译生成可执行文件 2.nvprof ./test 可以把性能分析数据输出到文件中 nvprof ./test -o test.nvvp 可以把在nvidia visual profiler现实更加直观 一些常用的配置参数&#xff1a; achie…

HUE Load Balancer 启动失败

安装LoadBalancer服务的机器要安装mod_ssl&#xff0c;httpd 解决方案&#xff1a; yum -y install mod_ssl 注意&#xff1a;安装前也要安装httpd服务&#xff0c;安装完成后记得查看是否启动 yum -y install httpd 异常信息如下&#xff1a; Cant open /opt/cm-5.13.0/r…

cuda nsight 调试和性能分析

如果cuda需要调试需要在配置cmake: cmake配置 set(CUDA_NVCC_FLAGS -G;-g) 命令行编译配置&#xff1a; nvcc –g –G MatrixCUDA.cu –o MatrixCUDA 打开 nvidia nsight monitor ->options进行设置 2.尽量把WDDM TDR Delay 调大点 3.将 use this monitor for cuda att…

html之元素与元素的形成

1.<title> 标签定义文档的标题。2.<p>插入文本内容 注意&#xff1a;<p> </p>整体等同于<p>3.有一些元素可以忽略开始标签4.合理嵌套

cuda线程束原语 __shfl_xor、__shfl、__shfl_up()、__shfl_down()

在CC3.0以上&#xff0c;支持了shuffle指令&#xff0c;允许thread直接读其他thread的寄存器值&#xff0c;只要两个thread在 同一个warp中&#xff0c;这种比通过shared Memory进行thread间的通讯效果更好&#xff0c;latency更低&#xff0c;同时也不消耗额外的内存资源来执行…

Hue添加RDBMS(关系型数据库)

Hue添加RDBMS方式 Hue界面没有Mysql添加方式&#xff0c;需要修改配置切换至Hue3界面&#xff0c;找一下 3.发现有添加方式 4.点进去发现&#xff0c;说要再配置文件中添加 5.经查阅资料发现&#xff0c;需要在hue的配置中hue_safety_valve.ini 修改/添加 相关数据库配置 6.…

html之属性的定义

<元素 属性"值"(或者值)>内容</元素>2.3.4属性的定义1.不定义属性2.属性值中的空白eg:<img src"c:/hello world">因为属性值是连续字符序列&#xff0c;因此hello与world之间的空白处应该用%20&#xff0c;<img srcc:/hello%20world&…

#error This file requires compiler and library support for the ISO C++ 2011 standard

解决方式&#xff1a; set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdc11")

HBase BlockCache系列 - 探求BlockCache实现机制

转载自&#xff1a;http://hbasefly.com/2016/04/26/hbase-blockcache-2/ HBase BlockCache系列第一篇文章《走进BlockCache》从全局视角对HBase中缓存、Memstore等作了简要概述&#xff0c;并重点介绍了几种BlockCache方案及其演进过程&#xff0c;对此还不了解的可以点这里。…

html之属性的应用

在html文档中&#xff0c;某些地方不允许存在某些字符。因此使用其他字符代替eg&#xff1a;小于号(<)和and符号(&)&#xff0c;如果错误的使用这些符号&#xff0c;会造成html解析器将显示错误。eg&#xff1a;<p><html></p>可以显示html如果不用其他…

ubuntu安装tensorflow-gpu 和pytorch

本文参考了&#xff1a; https://blog.csdn.net/qq_27825451/article/details/89082978 谢谢这位博主 这里我们选择清华源 sudo python -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu1.2.0 pip install -i https://pypi.tuna.tsinghua.edu.c…

Hbase Memstore刷新方式与Region的数目上限

目录 Region数目上限 Region大小上限 MemStore的刷新方式&#xff08;触发条件&#xff09; HLog (WAL) Size & Memstore Flush 频繁的Memstore Flushes Region数目上限 RegionServer的region数目取决于memstore的内存使用&#xff0c;每个region拥有一组memstore&am…

CDH- Hive HWI 配置

目录 一、HWI安装 二、其中遇到一些问题&#xff1a; 1.遇到如下问题&#xff0c;将jre环境中的toos.jar 服务到lib目录下 2.CDH中没有hwi相关配置参数&#xff0c;手动加入并修改端口为9998&#xff0c;发现并未生效&#xff0c;暂时未找到原因所在。 一、HWI安装 通过查看…

ubuntu 安装PCL

如果你对PCL版本没有要求可以根据下面的方式安装&#xff1a; sudo apt-get install libpcl-dev 编译工程的时候可能会出现两个错误&#xff1a; 1. *** No rule to make target /usr/lib/x86_64-linux-gnu/libproj.so, needed by pcl_test. Stop 解决方式&#xff1a; s…

html之添加注释

为文档添加注释 <!--这里是注释--> 或者 <!--这里也是注释 并且可以分为多行-->

Hive - HWI 简单使用

进入HWI web页面 查看数据库中的表&#xff1a; 单击Create Session&#xff0c;并输入任务名称&#xff08;自定义&#xff09; 输入相关信息 Result File:结果输出文件 Error File:错误输出文件(可不填) Query&#xff1a;需要执行的语句,一些需要设置的参数也在这里面进…