实现导致分段错误的 avl 树
Implementation of avl tree causing segmentation fault
我正在尝试实现一个avl树。这是我第一次这样做,所以我的代码充满了错误。例如,当我在 avl 树中插入一个元素时,它会导致分段错误。更具体地说,第一次在树上插入元素时,还可以,但是第二次插入会导致运行时错误。这是我的代码:
avl_tree.hpp
template< class key_t, class compare_t=std::less< key_t > >
struct avl_tree {
private:
struct node {
node *l, *r;
int h, size;
key_t key;
node( key_t k ) : l( 0 ), r( 0 ), h( 1 ), size( 1 ), key( k ) {}
void u() {
h=1+std::max( ( l?l->h:0 ), ( r?r->h:0 ) );
size=( l?l->size:0 ) + ( r?r->size:0 ) + 1;
}
} *root;
compare_t cmp;
node* rotl( node *x ) {
node *y=x->r;
x->r=y->l;
y->l=x;
x->u(); y->u();
return y;
}
node* rotr( node *x ) {
node *y=x->l;
x->l=y->r;
y->r=x;
x->u(); y->u();
return y;
}
node* balance( node *x ) {
x->u();
if( x->l->h > 1 + x->r->h ) {
if( x->l->l->h < x->l->r->h ) x->l = rotl( x->l );
x = rotr( x );
} else if( x->r->h > 1 + x->l->h ) {
if( x->r->r->h < x->r->l->h ) x->r = rotr( x->r );
x = rotl( x );
}
return x;
}
node* _insert( node *t, key_t k ) {
if( t==NULL ) return new node( k );
if( cmp( k, t->key ) ) { std::cout<<"going left."<<std::endl; t->l = _insert( t->l, k ); }
else { std::cout<<"going right."<<std::endl; t->r = _insert( t->r, k ); }
std::cout << "calling balance." << std::endl;
return balance( t );
}
void _inorder( node *t ) {
if( t ) {
_inorder( t->l );
std::cout << t->key << " ";
_inorder( t->r );
}
}
public:
avl_tree() : root( 0 ) {}
void insert( key_t k ) {
root = _insert( root, k );
}
void inorder() { _inorder( root ); }
};
主.cpp
#include <iostream>
#include "avl_tree.hpp"
using namespace std;
int main() {
avl_tree< int > avl;
for( int i=0; i<5; ++i ) {
int tmp;
scanf( "%d", &tmp );
avl.insert( tmp );
}
avl.inorder();
return 0;
}
发布评论作为答案:
崩溃的可能原因是balance
方法,当访问l
和r
node
的成员时。当您在树中只有 2 个节点时,其中一个节点可能NULL
,因此添加NULL
-check(就像在方法u
中完成的方式一样)可能会有所帮助。
旁注:要在代码中使用scanf
,您需要包含<cstdio>
,或者更好的是,您可以使用cin
来读取tmp
。
希望这有帮助!
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 如何修复重新平衡时AVL删除操作中的分段错误?
- 实现导致分段错误的 avl 树
- AVL 树子项目上的分段错误
- AVL树的C 代码给出了访问违规错误
- AVL树双重旋转错误
- AVL树代码中的错误,数据结构c++