c++ 无法在AVL树中正确插入节点

f87krz0w  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(120)

有人能帮助我AVL树,我想我做错了,当计算新的平衡rotationRightLeft函数.我不允许使用最大函数,所以我尝试这种方法..
第一个
我测试了insert方法,下面是输出。有人能告诉我平衡计算出了什么问题吗?它似乎在rotationLeftRight方法中工作,因为元素2的节点被插入到元素4的节点的左边(见输出图像)
rotationLeftRight函数中使用的计算I:
第一次
output

rsaldnfx

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.激冷
在代码中,它将类似于

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);

相关问题