다음은 내 Node 클래스입니다. 내가 실행하면값을 기준으로 포인터를 전달하는 바이너리 트리에 재귀 적으로 삽입 하시겠습니까?
int main()
{
Btree<int> tree;
tree.insert(5, tree.root);
cout << tree.root->data << endl;
tree.insert(6, tree.root);
cout << tree.root->right->data << endl;
}
, 나는 독방 감금 오류를 얻을 :
이public:
Node<T>* root;
Btree() : root(NULL){}
void insert(T data, Node<T>* parent)
{
if(!parent )
{
parent = new Node<T>(data);
return;
}
else if(data < parent->data)
{
insert(data, parent->left);
}
else if(data > parent->data)
{
insert(data, parent->right);
}
}
};
여기 내 주요 기능입니다 :
class Node
{
private:
public:
T data;
Node<T>* left;
Node<T>* right;
Node(T dat) : data(dat), left(NULL), right(NULL)
{}
};
여기 내 BTREE 클래스에 정의 된 내 삽입 기능입니다.
포인터 변수 부모가 값에 의해 전달되므로 부모가 가리키는 새 노드를 만들 때 삽입 기능을 종료하면 잃어 버릴 수 있다고 생각합니까? 여기에 이중 포인터를 사용해야한다는 의미입니까?
누군가가 메모리에서 진행되고있는 일에 대해 철저히 설명하여 계획대로 작동하지 않게 할 수 있습니까? 내 진단이 올바른지 아니면 다른 문제가 있습니까?
삽입 할 두 번째 매개 변수로 tree.root를 전달할 때 Node *를 전달할 예정입니다. 이제 값으로 전달 되더라도 호출하는 주 기능에서 전달한 주소와 같지 않습니다. 그래서 부모 (내가 main, tree.root에서 전달한 주소) = new Node라고 할 때 부모 노드의 주소 인 tree.root의 주소에 힙에 새로운 노드를 만들지 말아야합니까? 왜 가치 전달은 이것을 퍼지로합니까?
오히려 추측보다, 당신은 실행할 수 있지만, 좀 더 간결한 해결책이 디버거에서 프로그램을 실행하면 어떤 라인에서 seg-fault가 발생했는지 정확히 ** 알려줍니다. 그런 다음 변수 값 등을 검사하여 어떤 일이 발생했는지 파악할 수 있습니다. –
어떤 행이 seg 오류를 일으켰는지 알고 있습니다. 값으로 주소를 전달하는 것에 대한 설명을 요구하고 있습니다. – ordinary