AVL树从来没有不均衡的平衡C++
AVL Tree never having uneven balance C++
所以我正在制作一个自平衡的AVL树,我正在实现它,就像我看到的许多其他AVL树一样,但当我去平衡树时,我的函数会返回树是平衡的,而它显然不是平衡的。
这是我的AVLTree
类:
#include "AVLTree.h"
#include "Node.h"
#include <iostream>
using namespace std;
AVLTree::AVLTree(void)
{
root = nullptr;
}
Node* AVLTree::GetRoot()
{
return root;
}
Node* AVLTree::RotateLeft(Node *root)
{
Node *temp = root;
root = temp->GetRight();
temp->SetRight(root->GetLeft());
root->SetLeft(temp);
return root;
}
Node* AVLTree::RotateRight(Node *root)
{
Node *temp = root;
root = temp->GetLeft();
temp->SetLeft(root->GetRight());
root->SetLeft(temp);
return root;
}
Node* AVLTree::DoubleRight(Node *root)
{
RotateLeft(root->GetLeft());
RotateRight(root);
return root;
}
Node* AVLTree::DoubleLeft(Node *root)
{
RotateRight(root->GetRight());
RotateLeft(root);
return root;
}
void AVLTree::Add(int value, Node *r)
{
Node *node;
if (r == nullptr)
node = root;
if (root == nullptr)
{
root = new Node(value);
return;
}
if (value < node->GetValue())
{
if (node->GetLeft() == nullptr)
{
node->SetLeft(new Node(value));
node = MakeBalance(node);
}
else
{
Add(value, node->GetLeft());
node = MakeBalance(node);
}
}
else if (node->GetRight() == nullptr)
{
node->SetRight(new Node(value));
node = MakeBalance(node);
}
else
{
Add(value, node->GetRight());
node = MakeBalance(node);
}
}
void AVLTree::Traverse(Node *node)
{
cout << node->GetValue() << ", ";
if (node->GetLeft() != nullptr)
Traverse(node->GetLeft());
if (node->GetRight() != nullptr)
Traverse(node->GetRight());
}
int AVLTree::CheckHeight(Node *node)
{
int height = 0;
if (node != nullptr)
{
int left = CheckHeight(node->GetLeft());
int right = CheckHeight(node->GetRight());
height = max(left, right) + 1;
}
return height;
}
int AVLTree::GetDifference(Node *node)
{
int left = CheckHeight(node);
int right = CheckHeight(node);
int balance = left - right;
return balance;
}
Node* AVLTree::MakeBalance(Node *node)
{
int balance = GetDifference(node);
if (balance > 1)
{
if (GetDifference(node->GetLeft()) > 0)
node = RotateLeft(node);
else
node = DoubleLeft(node);
}
else if (balance < -1)
{
if (GetDifference(node->GetRight()) > 0)
node = DoubleRight(node);
else
node = RotateRight(node);
}
return node;
}
我已经穿过它几次了,在我加3、5和10之后,它不断返回左平衡为2,右平衡为2。
这部分跳到我面前:
int AVLTree::GetDifference(Node *node)
{
int left = CheckHeight(node);
int right = CheckHeight(node);
int balance = left - right;
return balance;
}
这将总是导致left == right
,并因此导致left - right == 0
。
你忘了把孩子们传进来:
// You might want this too: if (!node) return 0;
int left = CheckHeight(node->GetLeft());
int right = CheckHeight(node->GetRight());
int balance = left - right;
return balance;
相关文章:
- 堆栈问题(平衡表达式问题集)
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 二叉树结构平衡,使用递归时EXC_BAD_ACCESS
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 迭代器范围的平衡分区,没有LegacyRandomAccessIterator
- 使用堆栈从黑客等级中解决平衡括号检查的错误
- C++如何在宏调用后平衡括号?
- 签入二叉树的函数是平衡C++
- 检查BST中每个节点的平衡因子并将其存储在节点中
- 我该如何平衡一棵退化的树?C++数据结构
- OpenMP 和不平衡嵌套循环
- 使用 vector 检查表达式中的括号是否平衡
- 如何修复重新平衡时AVL删除操作中的分段错误?
- 平衡括号问题为什么要检查它是否为空?
- 平衡数组索引,同时从左和右对数组求和
- OpenMP C++:并行化 for 循环的负载不平衡
- 可以提示插入到标准::地图导致不平衡的树
- C++ 使用数组结构创建平衡的二叉搜索树
- 是平衡二进制树上预购和DFS的时间复杂性
- 删除字符串中不平衡的括号