高度平衡树代码中的分段错误
segmentation fault in height balance tree code
当我尝试这样做时:
int main(){
node * root;
insert(&root, 10);
insert(&root, 20);
insert(&root, 30);
insert(&root, 40);
insert(&root, 50);
insert(&root,60);
preorder(root);
return 0;
}
我的代码运行良好并给出了输出。
但是当我这样做时:
int main(){
node * root;
insert(&root, 10);
insert(&root, 20);
insert(&root, 30);
insert(&root, 40);
insert(&root, 50);
insert(&root,60);
preorder(root);
node * t;
insert(&t,9);
insert(&t,15);
insert(&t,18);
insert(&t,33);
insert(&t,55);
insert(&t,44);
insert(&t,61);
return 0;
}
它给出了一个分段错误...
此外,如果我评论:
preorder(root);
代码运行良好..
如果我最后对节点 t 进行了预订,它就可以正常工作...
不知道当我尝试在 t 之前打印 root 的预序时我是如何得到这个分段错误的?
插入代码段:
void insert(node ** root, int d){
node * t= *root;
*root=_insert(t,d);
}
node * _insert(node * t, int d){
if(t==NULL)
return newNode(d);
else{
if(d < t->data)
t->left=_insert(t->left,d);
if(d > t->data)
t->right=_insert(t->right,d);
t->height= max(ht(t->left),ht(t->right))+1;
int bal= ht(t->left)-ht(t->right);
if(bal > 1 && d < t->data)
return rightRotate(t);
if(bal < -1 && d > t->data)
return leftRotate(t);
if(bal < -1 && d > t->data){
t->right=rightRotate(t->right);
return leftRotate(t);
}
if(bal >1 && d < t->data){
t->left=leftRotate(t->left);
return rightRotate(t);
}
return t;
}
}
预购代码段:
void preorder(node * t){
if(t==NULL)
return;
else {
cout<<t->data<<" ";
preorder(t->left);
preorder(t->right);
}
}
代码和节点结构中使用的辅助函数:
struct node{
int data;
node * left;
node * right;
int height;
};
node * newNode(int d){
node * t;
t= new node;
t->data = d;
t->left=NULL;
t->right=NULL;
t->height=1;
return t;
}
int ht(node * t){
if(t==NULL)
return 0;
else
return t->height;
}
node * leftRotate(node * t){
node * y = t->right;
t->right= y->left;
y->left=t;
return y;
}
node * rightRotate(node * t){
node * y = t->left;
t->left= y->right;
y->right=t;
return y;
}
你的代码中有undefined behavior,因为局部变量没有初始化,它们的值是不确定的。
您需要先初始化变量,然后再尝试使用它们,例如
node* root = nullptr; // or `0` or `NULL`
当我尝试这样做时:
int main(){
node * root;
insert(&root, 10);
insert(&root, 20);
insert(&root, 30);
insert(&root, 40);
insert(&root, 50);
insert(&root,60);
preorder(root);
return 0;
}
我的代码运行良好并给出了输出。
但是当我这样做时:
int main(){
node * root;
insert(&root, 10);
insert(&root, 20);
insert(&root, 30);
insert(&root, 40);
insert(&root, 50);
insert(&root,60);
preorder(root);
node * t;
insert(&t,9);
insert(&t,15);
insert(&t,18);
insert(&t,33);
insert(&t,55);
insert(&t,44);
insert(&t,61);
return 0;
}
它给出了一个分段错误...
此外,如果我评论:
preorder(root);
代码运行良好..
如果我最后对节点 t 进行了预订,它就可以正常工作... 不知道当我尝试在 t 之前打印 root 的预序时我是如何得到这个分段错误的?
插入代码段:
void insert(node ** root, int d){
node * t= *root;
*root=_insert(t,d);
}
node * _insert(node * t, int d){
if(t==NULL)
return newNode(d);
else{
if(d < t->data)
t->left=_insert(t->left,d);
if(d > t->data)
t->right=_insert(t->right,d);
t->height= max(ht(t->left),ht(t->right))+1;
int bal= ht(t->left)-ht(t->right);
if(bal > 1 && d < t->data)
return rightRotate(t);
if(bal < -1 && d > t->data)
return leftRotate(t);
if(bal < -1 && d > t->data){
t->right=rightRotate(t->right);
return leftRotate(t);
}
if(bal >1 && d < t->data){
t->left=leftRotate(t->left);
return rightRotate(t);
}
return t;
}
}
预购代码段:
void preorder(node * t){
if(t==NULL)
return;
else {
cout<<t->data<<" ";
preorder(t->left);
preorder(t->right);
}
}
代码和节点结构中使用的辅助函数:
struct node{
int data;
node * left;
node * right;
int height;
};
node * newNode(int d){
node * t;
t= new node;
t->data = d;
t->left=NULL;
t->right=NULL;
t->height=1;
return t;
}
int ht(node * t){
if(t==NULL)
return 0;
else
return t->height;
}
node * leftRotate(node * t){
node * y = t->right;
t->right= y->left;
y->left=t;
return y;
}
node * rightRotate(node * t){
node * y = t->left;
t->left= y->right;
y->right=t;
return y;
}
你的代码中有undefined behavior,因为局部变量没有初始化,它们的值是不确定的。
您需要先初始化变量,然后再尝试使用它们,例如
node* root = nullptr; // or `0` or `NULL`