有关BST搜索树转换为AVL高度平衡树的旋转问题

简介:

最近在复习数据结构,看到BST的时候遇到了问题,就是当删除或增加树中节点时,要求保证树的高度平衡行,也就是使BST成为AVL。


后来看了很多资料,说LL、RR、LR、RL啥的,没看懂。之后经过和同学研究发现了一个特性,就是offending node与其回溯路径上的最近的两个点有大小关系。

wKiom1LLjJyS8zHjAAA-UEATkyU808.jpg

如上图,一个空BST树,插入16到树中,由于是空树,那么16就作为根节点。之后再输入3。3比16小,放在16的左边作为左子节点,再输入7,7比16小,走左子树一边,然后7再和3相比较,7比3大,走3的右子树。但是如上图所示,这不是一棵AVL树,因为16的左子树高度为2,右子树高度为0,左右高度差的绝对值为2,超过了AVL的条件:左右高度绝对差<2。那么就需要“旋转子树”以保证其AVL特性。


看了很多书,都说什么左旋转啊右旋转啊,像上图这种情况还比较复杂,需要先左旋转后右旋转。


其实,经过这些天的研究发现,以上图为例,当节点7进入树之后,打破了平衡,那么就从节点7开始回溯找到offending node,也就是节点16。然后选择offending node与回溯路径上的距离节点16的最近的两个node,也就是节点3和7。这三个点选取之后,对三个点进行大小比较,找出最小、最大和中间节点,比如16、3、7三个节点的按大小排序后的顺序是3、7、16。然后中间的节点(节点7)作为新树的根,其左节点是最小节点,右节点是最大节点,然后将新树接回原来的树上。


本文转自 rickqin 51CTO博客,原文链接:http://blog.51cto.com/rickqin/1349348


相关文章
|
5月前
|
算法
AVL树,Treap树,红黑树的实现(上)
AVL树,Treap树,红黑树的实现
|
6月前
【数据结构】单值二叉树 & 相同的树 & 翻转二叉树(五)
【数据结构】单值二叉树 & 相同的树 & 翻转二叉树(五)
27 0
二叉搜索树之AVL树
二叉搜索树之AVL树
|
5月前
AVL树,Treap树,红黑树的实现(下)
AVL树,Treap树,红黑树的实现
|
6月前
【Leetcode -110.平衡二叉树 -226.翻转二叉树】
【Leetcode -110.平衡二叉树 -226.翻转二叉树】
17 0
|
6月前
|
机器学习/深度学习 C++
AVL树的插入(C++实现)
AVL树的插入(C++实现)
48 0
|
10月前
|
C++
【C++】AVL树的插入实现(详解旋转机制)
【C++】AVL树的插入实现(详解旋转机制)
80 0
|
11月前
|
算法 C++ 容器
【C++】AVL树和红黑树的插入
【C++】AVL树和红黑树的插入
二叉树、平衡二叉树AVL、红黑树、B树、B+树
B树的阶数等于叶节点最大关键字数量+1(因为关键字两边都有指向子节点的指针-分叉) 在m阶(m叉)B树中除根结点外,任何节点至少[m/2]个分叉,即至少[m/2]-1个关键字, [ ]代表向上取整。 节点内的关键字采用顺序查找或二分查找。 因为关键字太少会导致树变高,降低查找效率。另外就是保证同级子树的高度相同-平衡。
数据结构——再赏“树“,关于搜索二叉树(BST树)和平衡二叉树(AVL树)那点事儿~(1)
数据结构——再赏“树“,关于搜索二叉树(BST树)和平衡二叉树(AVL树)那点事儿~(1)
98 0
数据结构——再赏“树“,关于搜索二叉树(BST树)和平衡二叉树(AVL树)那点事儿~(1)