gpt4 book ai didi

c++ - AVL树插入方法导致段错误

转载 作者:行者123 更新时间:2023-11-30 04:50:07 25 4
gpt4 key购买 nike

编辑:insert() 现在似乎可以正常工作,但是打印树时出现问题。

void AVL::preorder(Node *n) {
if(n != nullptr) {
cout << n->value << ", ";
preorder(n->left);
preorder(n->right);
}
}

void AVL::printPreorder() {
preorder(node);
}

我的问题是,在我将第一个值插入树后,我无法再插入更多。当我尝试插入超过 1 个值时,程序因段错误而中断。我在这里找不到问题。看起来它在 if() 语句中中断,但我不知道那有什么问题。起初我只使用 struct 编写程序,它可以工作,但我必须将它修改为一个内部结构的完整类。编辑:添加 main.cpp

int main() {

AVL avl;
avl.insert(2);
avl.insert(6); // breaks
return 0;
}

avl.h

class AVL {
public:
struct Node {
int value;
int height;
Node* left;
Node* right;
};
Node* node;

AVL();
~AVL();
int getHeight(Node *tree);
Node *newNode(int val);
Node *rightRotate(Node *y);
Node *leftRotate(Node *x);
int getBalance(Node *b);
Node *insertVal(Node *node, int thisval);
void preorder(Node *n);
void printPreorder();
Node *minValNode(Node *minValNode);
Node *remove(Node *n, int thisval);
Node *insert(int val);
};

.cpp

AVL::AVL() {
node = nullptr;
}
AVL::Node* AVL::insertVal(Node *node, int thisval) {
if(node == nullptr) {
return newNode(thisval);
}

if(thisval < node->value) {
node->left = insertVal(node, thisval);
}
else if(thisval > node->value) {
node->right = insertVal(node, thisval);
}
else {
return node;
}

node->height = max(getHeight(node->left), getHeight(node->right)) + 1;

int balance = getBalance(node);

if(balance > 1 && thisval < node->left->value) {
return rightRotate(node);
}
if(balance < -1 && thisval > node->right->value) {
return leftRotate(node);
}
if(balance > 1 && thisval > node->left->value) {
node->left = leftRotate(node->left);
return rightRotate(node);
}
if(balance < -1 && thisval > node->right->value) {
node->right = rightRotate(node->right);
return leftRotate(node);
}

return node;
}
AVL::Node* AVL::insert(int val) {
return insertVal(node, val);
}
int AVL::getHeight(Node *tree) {
if(tree == nullptr) {
return 0;
} else {
return tree->height;
}
}
AVL::Node* AVL::newNode(int val) {
node = new Node;
node->value = val;
node->height = 1;
node->left = nullptr;
node->right = nullptr;
return node;
}
AVL::Node* AVL::rightRotate(Node *y) {
Node *x = y->left;
Node *T2 = x->right;

x->right = y;
y->left = T2;

x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
y->height = max(getHeight(y->left), getHeight(y->right)) + 1;

return x;
}
AVL::Node* AVL::leftRotate(Node *x) {
Node *y = x->right;
Node *T2 = y->left;

x->right = T2;
y->left = x;

x->height = max(getHeight(x->left), getHeight(x->right)) + 1;
y->height = max(getHeight(y->left), getHeight(y->right)) + 1;

return y;
}
int AVL::getBalance(Node *b) {
if(b == nullptr) {
return 0;
} else {
return getHeight(b->left) - getHeight(b->right);
}
}

最佳答案

所以,我早就忘记了 AVL 算法的细节,但我可以解释您的代码崩溃的地方。您有一个导致堆栈溢出的无限递归循环。

AVL::Node* AVL::insertVal(Node *node, int thisval) {
if (node == nullptr) {
return newNode(thisval);
}

if (thisval < node->value) {
node->left = insertVal(node, thisval);
}
else if (thisval > node->value) {
node->right = insertVal(node, thisval);
}
else {
return node;
}

在此代码中以及您提供的主要内容中 thisval > node->value是真的所以insertval 使用完全相同的参数再次调用。所以整个过程会重复、重复、重复,直到出现堆栈溢出。

我猜你是这个意思

AVL::Node* AVL::insertVal(Node *node, int thisval) {
if (node == nullptr) {
return newNode(thisval);
}

if (thisval < node->value) {
node->left = insertVal(node->left, thisval);
}
else if (thisval > node->value) {
node->right = insertVal(node->right, thisval);
}
else {
return node;
}

此错误是使用调试器在大约两分钟内发现的。在您开发的这个阶段,它可能是您可以学习使用的最有用的东西。

关于c++ - AVL树插入方法导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55118542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com