- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试按照 here 中的指南实现 AVL 树.我在让它工作时遇到了一些问题。目前我在插入的“右右案例”中收到此错误。具体在这一行:
// Right Right Case
if (balance < -1 && theData > root->right->data)
leftRotate(root);
我得到的错误是:
Exception thrown: read access violation.
root._Mypair._Myval2->right._Mypair._Myval2 was nullptr.
如果有人能帮我解决这个问题,我将不胜感激。
这是我的代码:
#include <algorithm>
#include <iostream>
#include <memory>
#include <utility>
#include <stack>
#include <queue>
struct Node {
int data;
int height;
std::unique_ptr<Node> left = nullptr;
std::unique_ptr<Node> right = nullptr;
Node(const int& x, const int& y, std::unique_ptr<Node>&& p = nullptr, std::unique_ptr<Node>&& q = nullptr) :
data(x),
height(y),
left(std::move(p)),
right(std::move(q)) {}
Node(const int& data) : data(data), height(1) {}
};
std::unique_ptr<Node> root = nullptr;
int height(std::unique_ptr<Node>& root) {
if (!root) return 0;
return root->height;
}
void rightRotate(std::unique_ptr<Node>& y) {
std::unique_ptr<Node> x = std::move(y->left);
std::unique_ptr<Node> T2 = std::move(x->right);
// Perform rotation
x->right = std::move(y);
x->right->left = std::move(T2);
// Update heights
x->right->height = std::max(height(x->right->left), height(x->right->right)) + 1;
x->height = std::max(height(x->left), height(x->right)) + 1;
}
void leftRotate(std::unique_ptr<Node>& x) {
std::unique_ptr<Node> y = std::move(x->right);
std::unique_ptr<Node> T2 = std::move(y->left);
// Perform rotation
y->left = std::move(x);
y->left->right = std::move(T2);
// Update heights
y->left->height = std::max(height(y->left->left), height(y->left->right)) + 1;
y->height = std::max(height(y->left), height(y->right)) + 1;
}
int heightDiff(std::unique_ptr<Node>& root) {
if (!root) return 0;
return height(root->left) - height(root->right);
}
void insert(std::unique_ptr<Node>& root, const int& theData) {
std::unique_ptr<Node> newNode = std::make_unique<Node>(theData);
// Perform normal BST insertion
if (root == nullptr) {
root = std::move(newNode);
return;
}
else if (theData < root->data) {
insert(root->left, theData);
}
else {
insert(root->right, theData);
}
// Update height of this ancestor node
root->height = 1 + std::max(height(root->left), height(root->right));
// Get the balance factor of this ancestor node to check whether this node became unbalanced
int balance = heightDiff(root);
// If this node become unbalaced, then we have 4 cases
// Left Left Case
if (balance > 1 && root->left && theData < root->left->data)
rightRotate(root);
// Right Right Case
if (balance < -1 && root->right && theData > root->right->data)
leftRotate(root);
// Left Right Case
if (balance > 1 && root->left && theData > root->left->data) {
leftRotate(root->left);
rightRotate(root);
}
// Right Left Case
if (balance < -1 && root->right && theData < root->right->data) {
rightRotate(root->right);
leftRotate(root);
}
}
auto findMin(std::unique_ptr<Node>& root) {
while (root->left != nullptr) root = std::move(root->left);
return root.get();
}
void deleteNode(std::unique_ptr<Node>& root, const int& theData) {
// Step 1: Perform regular deletion for BST
if (!root) return;
else if (theData < root->data) deleteNode(root->left, theData);
else if (theData > root->data) deleteNode(root->right, theData);
else {
// Case 1: No child
if (root->left == nullptr && root->right == nullptr) {
root = nullptr;
}
// Case 2: One child
else if (root->left == nullptr) {
root = std::move(root->left);
}
else if (root->right == nullptr) {
root = std::move(root->right);
}
// Case 3: Two children
else {
auto temp = findMin(root->right);
temp->data = root->data;
deleteNode(root->right, temp->data);
}
}
// Step 2: Update height of the current node
root->height = 1 + std::max(height(root->left), height(root->right));
// Step 3: Get the balalce factor of the this node (to
// check whether this node became unbalanced)
int balance = heightDiff(root);
// If this node becomes unbalanced, then there are 4 cases
// Left Left Case
if (balance > 1 && heightDiff(root->left) >= 0)
rightRotate(root);
// Left Right Case
if (balance > 1 && heightDiff(root->left) < 0) {
leftRotate(root->left);
rightRotate(root);
}
// Right Right Case
if (balance < -1 && heightDiff(root->right) <= 0)
leftRotate(root);
// Right Left Case
if (balance < -1 && heightDiff(root->right) > 0) {
rightRotate(root->right);
leftRotate(root);
}
}
void inorderTraversal(std::unique_ptr<Node>& root) {
if (!root) {
inorderTraversal(root->left);
std::cout << root->data << " ";
inorderTraversal(root->right);
}
}
void preorderTraversal(std::unique_ptr<Node>& root) {
if (root != nullptr) {
std::cout << root->data << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
void postorderTraversal(std::unique_ptr<Node>& root) {
if (root != nullptr) {
postorderTraversal(root->left);
postorderTraversal(root->right);
std::cout << root->data << " ";
}
}
void DFS(std::unique_ptr<Node>& root) {
if (!root) return;
std::stack<Node const *> s;
s.push(root.get());
while (!s.empty()) {
auto p = s.top();
s.pop();
if (p->right != nullptr) s.push(p->right.get());
if (p->left != nullptr) s.push(p->left.get());
std::cout << p->data << " ";
}
}
void BFS(std::unique_ptr<Node>& root) {
if (!root) return;
std::queue<Node const *> q;
q.push(root.get());
while (!q.empty()) {
auto p = q.front();
q.pop();
if (p->left != nullptr) q.push(p->left.get());
if (p->right != nullptr) q.push(p->right.get());
std::cout << p->data << " ";
}
}
bool exists(int d) {
auto temp = root.get();
while (temp != nullptr) {
if (temp->data == d) {
return true;
}
else {
if (d > temp->data) {
temp = temp->right.get();
}
else {
temp = temp->left.get();
}
}
}
return false;
}
int main() {
// 8
// / \
// 4 10
// / \ / \
// 2 6 9 12
//insert(root, 8);
//insert(root, 10);
//insert(root, 4);
//insert(root, 2);
//insert(root, 6);
//insert(root, 12);
//insert(root, 9);
/* Constructing tree given in the above figure */
insert(root, 9);
insert(root, 5);
insert(root, 10);
insert(root, 0);
insert(root, 6);
insert(root, 11);
insert(root, -1);
insert(root, 1);
insert(root, 2);
/* The constructed AVL Tree would be
9
/ \
1 10
/ \ \
0 5 11
/ / \
-1 2 6
*/
printf("Preorder traversal of the constructed AVL "
"tree is \n");
preorderTraversal(root);
//deleteNode(root, 10);
/* The AVL Tree after deletion of 10
1
/ \
0 9
/ / \
-1 5 11
/ \
2 6
*/
//printf("\nPreorder traversal after deletion of 10 \n");
//preorderTraversal(root);
/*inorderTraversal(root);
std::cout << "\n";
preorderTraversal(root);
std::cout << "\n";
postorderTraversal(root);
std::cout << "\n";
DFS(root);
std::cout << "\n";
BFS(root);
std::cout << "\n";
exists(4) ? std::cout << "Yes" << std::endl : std::cout << "No" << std::endl;*/
std::cin.get();
}
最佳答案
我注意到您已经修复了 std::move() 问题。但您可能需要将以下几行添加到您的程序中。
void rightRotate(std::unique_ptr<Node>& y) {
....
x->height = std::max(height(x->left), height(x->right)) + 1;
y = std::move(x);
}
void leftRotate(std::unique_ptr<Node>& x) {
...
y->height = std::max(height(y->left), height(y->right)) + 1;
x = std::move(y);
}
关于c++ - 实现 AVL 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52564000/
相信维基百科文章:http://en.wikipedia.org/wiki/AVL_tree AVL trees are height-balanced, but in general not wei
我正在处理 AVL 树分配,我有一个关于它们定义的快速问题 - 我们得到了一个排序列表,我们必须在 O(n) 时间内从中生成一个 AVL 树。我已经完成了这个(感谢 StackOverflow 的其他
AVL 树与自平衡二叉搜索树相同。 AVL 代表什么?和发明者的名字有关系吗? 最佳答案 这是您猜到的发明者的名字。来自 wiki : AVL tree is named after its two
static String min ( AVLStringTreeNode t ) { if( t == null ) return t; while( t.left
一 点睛 平衡二叉查找树,简称平衡二叉树,由苏联数学家 Adelson-Velskii 和 Landis 提出,所以又被称为 AVL 树。 平衡二叉树或为空树,或为具有以下性质的平衡二叉树 1 左右子
更具体地说,是一个 AVL 树。是否可以?我想这样做,但我认为未删除的节点可能难以管理轮换。 我有一个可以正常工作的,但我想将这个带有延迟删除的用于其他用途。 最佳答案 如果您希望它相对于所有节点(包
更具体地说,如果使用 AVL 树而不是哈希表,是否可以更有效地执行任何操作? 最佳答案 我通常更喜欢 AVL 树而不是哈希表。我知道哈希表的预期时间 O(1) 复杂度优于 AVL 树的保证时间 O(l
我正在学习 AVL Tree 并在递归代码中获得了 TLE。我的导师建议迭代解决方案。我搜索并找到了一个将父节点保存在子节点中的解决方案。我想知道这个可能会在内存中出现问题,不是吗?还有另一种方法可以
据我所知AVL之间的时间复杂度树木和 Binary Search Trees在平均情况下是相同的,在最坏的情况下,AVL 会击败 BST。这给了我一个提示,即 AVL 在与它们交互的所有可能方式上总是
我正在用 C 语言实现 AVL 树。我在下面发布了我的树旋转,以及我在尝试测试它们时遇到的 valgrind 错误。 为什么我会收到这些错误?我知道 valgrind 错误源于我使用空指针这一事实,但
我试图理解以下 AVL 树的代码,但遇到了一些困难。我知道如果树很重,它就会向右旋转。同样,如果它是右重,它会向左旋转。如果有人能解释或指出我理解以下代码的正确方向,我将不胜感激。 static vo
我正在为 AVL 树编写右旋转。但它给出了运行时错误。目前我忽略了 AVL 树的高度部分。稍后我会处理这个问题。但是仅在 5 处应用右旋转就会出现问题。请帮助。我使用的AVL树是:
所以我有一个 C 语言的二叉搜索树代码,对我来说效果很好。但是,当我添加 BST 删除代码时,我的程序将在删除过程中崩溃。 它给我一个错误,提示访问冲突读取位置 0x00000000。 我认为这与传递
我正在为 AVL 树编写右旋转。目前我忽略了 AVL 树的高度部分。稍后我会处理这个问题。但是仅在 5 处应用右旋转会给出错误的值。即使执行右旋转后,l->data,ll->data,lll->dat
我在创建 AVL 树时遇到错误,我的代码的输出每次都给出无限循环。 在下面的代码中,mknode函数用于创建一个节点,lr,rl,right,leftfunctions用于执行所需的操作旋转,而插入函
我的 AVL 树是在 Java 中使用一个二维整数数组 avlTree[35][5] 实现的 - 列表示: [0] - 左侧高度 [1] - 左 child [2] - 数据 [3] - 右 chil
这个问题已经有答案了: What is a NullPointerException, and how do I fix it? (12 个回答) 已关闭 7 年前。 在第 7 行中,我得到 null
所以,我真的是编程新手,我现在正在上 C++ 类(class),我需要在其中编写和实现 AVL 树,使用双向链表打印树的内容,级别为等级。老师真的很挑剔,所以我们不能使用标准库中的任何容器。我的双向链
我被困在我的任务的一小部分,我基本上需要从 .txt 文件中插入数据(只是随机单词)并将它们作为数据添加到我的 AVL 树中。 我将向您展示我现在拥有的代码,该代码显然无法正常工作,但需要一些有关如何
我正在尝试用 Java 编写一个 AVL 树,并且已经在这个问题上停留了两个晚上。当运行以下代码时,肯定会发生旋转,但最终结果(例如 leftRotate)是我丢失了节点。 public AVLNod
我是一名优秀的程序员,十分优秀!