平衡二叉树(AVL)的左旋和右旋
最近算法和数据结构受虐,于是开始从二叉树学习,诸君共勉,同时也作为笔记。其实要理解思想不难,关键是要有耐心,不要觉得它难!
构建左平衡:
bf :平衡度,可取值LH(左高),EH(等高),RH(右高)
根节点记作T,根节点的左孩子记作L
判断左孩子L的平衡因子bf L-bf
:
若 LH
, 说明插入结点在T的左孩子的左子树上,此时单右旋就可以了(因为根节点和左孩子的平衡度同个方向)
若 RH
,则要双旋处理,即先左孩子左旋,在根节点右旋
接下来是重难点了,先说结论
若 Lr
的平衡度为LH,则修改T.bf =RH,L.bf=EH
若 Lr
的平衡度为EH,则修改T.bf =EH,L.bf=EH
若 Lr
的平衡度为RH,则修改T.bf =EH,L.bf=LH
接下来具体解释:
因为经过左旋和右旋,Lr的右子树Lrr最终要作为根节点T的左子树,所以他的高度决定了T的平衡度。
下面是完整代码: