我正在尝试使用他们的编辑器在Hackerrank(https://www.hackerrank.com/challenges/self-balancing-tree)上解决这个问题。以下是我写的C ++函数代码:
node* makeNewNode (int data)
{
node* temp= new node();
temp->val=data;
temp->left=NULL;
temp->right=NULL;
temp->ht=0;
return temp;
}
//------------------------------------------------------------
int height(node* temp)
{
if(temp==NULL)
return -1;
return temp->ht;
}
//------------------------------------------------------------
int balanceFactor(node* root)
{
if(root==NULL)
return 0;
return height(root->left)-height(root->right);
}
//------------------------------------------------------------
node* rightrotation(node* root)
{
node* temp1 = root->left;
node* temp = temp1->right;
temp1->right = root;
root->left = temp;
root->ht = max(height(root->left), height(root->right)) + 1;
temp1->ht = max(height(temp1->left), height(temp1->right)) + 1;
return temp1;
}
//------------------------------------------------------------
node* leftrotation(node* root)
{
node* temp = root->right;
node* temp1 = temp->left;
temp->left = root;
root->right = temp1;
root->ht = max(height(root->left), height(root->right)) + 1;
temp->ht = max(height(temp->left), height(temp->right)) + 1;
return temp;
}
//------------------------------------------------------------
node* insert( node* root, int data)
{
if(root == NULL)
return makeNewNode(data);
if(data<root->val)
root->left = insert(root->left, data);
else if(data>root->val)
root->right = insert(root->right, data);
else
return root;
root->ht = 1 + max(height(root->left), height(root->right));
int balance = balanceFactor(root);
if(data<root->left->val && balance>1)
return rightrotation(root);
if(data>root->right->val && balance<-1)
return leftrotation(root);
if(balance>1 && data > root->left->val)
{
root->left = leftrotation(root->left);
return rightrotation(root);
}
if(balance<-1 && data < root->right->val)
{
root->right = rightrotation(root->right);
return leftrotation(root);
}
return root;
}
我在行if(balance>1 && data > root->left->val)
中遇到了分段错误,但我无法弄清楚原因。在进入此之前,我尝试检查root->left
是null
,但即使这样也会给出seg错误。
因为我正在使用Hackerrank内置编辑器,所以主要功能得到了解决。
然而,出于调试目的,我添加了以下main():
int main()
{
node* root=NULL;
root=insert(root,1);
root=insert(root,2);
root=insert(root,3);
return 0;
}
我尝试了一个在线gdb(www.onlinegdb.com)并显示
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400aa2 in insert (root=0x603010, data=2) at main.cpp:86
86 if(data<root->left->val && balance>1)
请帮忙。
答案 0 :(得分:1)
你不能写
if(data<root->left->val && balance>1)
如果root
或root->left
可以是nullptr
。
如果您的AVL树只有一个根,并且您在正确的节点上插入,那么root->left == nullptr
和root->right
就是您插入的节点。
因此执行将继续data < root->left->val
,并且会产生分段错误。您需要插入更多条件,例如
if(root->left != nullptr && data<root->left->val && balance>1)
以下是修改后的插入函数:
node* insert( node* root, int data)
{
...
int balance = balanceFactor(root);
if(root->left && data<root->left->val && balance>1) // here was the segmentation fault with gdb
return rightrotation(root);
if(root->right && data>root->right->val && balance<-1)
return leftrotation(root);
if(balance>1 && root->left && data > root->left->val)
{ ... }
if(balance<-1 && root->right && data < root->right->val)
{ ... }
return root;
}