有人能帮助我AVL树,我想我做错了,当计算新的平衡rotationRightLeft函数.我不允许使用最大函数,所以我尝试这种方法..第一个我测试了insert方法,下面是输出。有人能告诉我平衡计算出了什么问题吗?它似乎在rotationLeftRight方法中工作,因为元素2的节点被插入到元素4的节点的左边(见输出图像)rotationLeftRight函数中使用的计算I:第一次output
rsaldnfx1#
以AVL树为例的学习算法是一个有趣的任务。谈论现有代码:在您的方法insert(Node*& node, const T& e)中,if中存在错误:同样,在条件体中发生的操作看起来就像从另一个if复制失败(++而不是--,等等)。关于翻转函数,据我所知,它们根本不起作用。要翻转,你必须以某种方式改变根和它的孩子的值,使左右两个孩子的最大死亡人数相等(或者说,它们的差值不应大于1)。简单地更改余额的值将不起作用。有关如何平衡AVL树的更多细节请参见here on SO或en.wikipedia。一般来说,你的右转应该遵循下一个算法:1.得到你的转折点(root),左子(left),右子(right)和left的右子(grandson)1.您可以让您的left成为您的新root1.旧root变成了新的right(因此它现在是旧left的正确子)1.旧的grandson成为旧的root的新的左子(因此根的新的右子的新的左子)1.激冷在代码中,它将类似于
insert(Node*& node, const T& e)
if
++
--
root
left
right
grandson
void turnRight(Node*& root, Node* left, Node* right, Node* grandson) { Node* old_root = root; root = left; left->right = old_root; old_root->left = grandson } turnRight(root, root->left, root->right, root->left->right);
1条答案
按热度按时间rsaldnfx1#
以AVL树为例的学习算法是一个有趣的任务。
谈论现有代码:
在您的方法
insert(Node*& node, const T& e)
中,if
中存在错误:同样,在条件体中发生的操作看起来就像从另一个if
复制失败(++
而不是--
,等等)。关于翻转函数,据我所知,它们根本不起作用。要翻转,你必须以某种方式改变根和它的孩子的值,使左右两个孩子的最大死亡人数相等(或者说,它们的差值不应大于1)。简单地更改余额的值将不起作用。有关如何平衡AVL树的更多细节请参见here on SO或en.wikipedia。
一般来说,你的右转应该遵循下一个算法:
1.得到你的转折点(
root
),左子(left
),右子(right
)和left
的右子(grandson
)1.您可以让您的
left
成为您的新root
1.旧
root
变成了新的right
(因此它现在是旧left
的正确子)1.旧的
grandson
成为旧的root
的新的左子(因此根的新的右子的新的左子)1.激冷
在代码中,它将类似于