C语言之平衡二叉树详解.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

C语言之平衡二叉树详解

目录什么是平衡二叉树平衡二叉树的基本特点为什么会出现平衡二叉树二叉树四种不平衡的情况C语言实现平衡二叉树

什么是平衡二叉树

平衡二叉树是具有平衡属性的有序二叉树,所谓的平衡即当前树的左右子树高度差的绝对值不超过1。因为平衡二叉树是由苏联数学家Adelson-Velskii和Landis提出,所以又称为AVL树。

平衡二叉树的基本特点

是特殊的有序二叉树左右子树高度差的绝对值不超过1左右子树仍然是平衡二叉树

为什么会出现平衡二叉树

在学习平衡二叉树之前必定已经学过有序二叉树,有序二叉树的结构特点就是将数据有序的排好,查找起来快,但是有序二叉树有一个缺点,就是当节点呈现的状态是一边倒,那查找数据的时候就没有发挥出二叉树折半查找的优势了,这个时候是线性的查找(类似于链表的查找)。平衡二叉树就是解决有序二叉树一边倒的问题。如果有序二叉树是平衡的,那么查找数据就很快。时间复杂度为O(logn)O(logn)O(logn)。这样就充分发挥了二叉树的优势。

二叉树四种不平衡的情况

当树的左右子树高度差的绝对值大于1的时候就需要进行旋转操作,将不平衡的树变成平衡的树。以下是会出现的四种不平衡的情况。

左左不平衡右右不平衡左右不平衡右左不平衡

左左不平衡旋转成平衡状态:

右右不平衡旋转成平衡状态:

左右不平衡旋转成平衡状态:

右左不平衡旋转成平衡状态:

上面是图解这四种不平衡状态旋转成平衡状态的情况。

C语言实现平衡二叉树

平衡二叉树的结构体描述:

#defineTyint//以整型数据为例

typedefstructNode

Tydata;//数据

intheight;//高度

structNode*LChild;//左子树

structNode*RChild;//右子树

}Node,AVLTree;

初始化函数:

AVLTree*creatAVLTree(Tydata)

AVLTree*tree=(AVLTree*)malloc(sizeof(AVLTree));

assert(tree);

tree-data=data;

tree-height=0;

tree-LChild=NULL;

tree-RChild=NULL;

returntree;

辅助宏函数:

//辅助函数

#defineHEIGHT(x)((x==NULL)(-1):(x-height))

#defineMAX(a,b)((ab)(a):(b))

//获取树的新高度

#defineGET_NEW_HEIGHT(x)(MAX(HEIGHT(x-LChild),HEIGHT(x-RChild))+1)

使用宏函数的好处是运行过程中不需要进行函数压栈的操作,效率快一点。

前序遍历平衡二叉树:

//前序打印

voidshow_pre(AVLTree*root)

if(root==NULL)

return;

printf(data:%d\theight:%d\n,root-data,root-height);

show_pre(root-LChild);

show_pre(root-RChild);

使用前序遍历能更好地看出节点的高度,更方便还原平衡二叉树。

四种不平衡状态旋转的算法实现:

算法核心思想:找到新根的位置,然后进行对应的调整,最后返回新根的地址,这样就实现了旋转的操作,因为旋转后节点的高度改变了,所以在返回之前先调整一下节点的高度。

例如:左左不平衡进行旋转操作

因为是左左不平衡,所以新根的位置是当前根的左子树,那就使用一个指针(newRoot)去接收当前根的左子树,然后使劲将当前根拉下来,让新根代替当前根的位置,那就必须将当前根的LChild指向newRoot的右子树(因为newRoot不一定是空的所以不能直接让curRootLChild指向空)。最后就是将newRootRChild指向curRoot这样就把位置调整好了。在返回newRoot之前把curRoot和newRoot的高度调整一下。保持树的准确性。

其他的不平衡情况也是类似的操作。

//出现不平衡的情况

//左左不平衡

Node*LL_Rotation(Node*curRoot)

Node*newRoot=curRo

文档评论(0)

152****4498 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档