해당 편집기를 사용하여 Hackerrank (https://www.hackerrank.com/challenges/self-balancing-tree)에서이 문제를 해결하려고합니다. 다음 C입니다 ++ 기능 코드는 내가 쓴 :AVL 트리 삽입 - 분할 오류
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 inbuilt 편집기를 사용하고 있기 때문에 주요 기능이 처리됩니다.
그럼에도 불구하고, 디버깅 목적을 위해, 나는 다음 주() 추가 :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)
이 도와주세요 보여줍니다.
오른쪽 도구는 디버거입니다 : 당신은 여기에 수정 된 삽입 기능입니다
같이 이상의 조건을 삽입해야합니다. 스택 오버플로를 묻기 전에 코드를 단계별로 실행해야합니다. 자세한 도움말은 [작은 프로그램 디버깅 방법 (Eric Lippert 작성)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)을 참조하십시오. 문제를 재현하는 [최소, 완료 및 확인 가능] (http://stackoverflow.com/help/mcve) 예제와 함께 해당 질문을 \ [편집]해야합니다. 디버거. –
위의 내용은 대략 다음과 같이 번역됩니다 : _ "main()'에서 수행 한 것을 포함시키고 위의 코드에서 문제가되는 것으로 의심되는 함수 만 남겨 두어 오류를 재현하고 확인할 수있게 할 수 있습니까?"_ – Ziezi