AVL 검색 트리를 구현 중입니다. 지금까지 코딩 부분을 마쳤으며 버그를 테스트하기 시작했습니다. 내 노드 회전 방법이 도청 된 것을 알았고 신에게있어 나는 그 문제가 무엇인지 이해할 수 없다.이진 트리 로테이션
알고리즘은 종이에서와 같이 작동하지만 컴퓨터에서 실행될 때 트리 노드가 누출됩니다.
이
은 왼쪽에 노드를 회전하는 데 사용 방법 : 부분 균형 나는 AVL 댓글을 달았 내 삽입 방법에 http://pastebin.com/mPHj29Afbool avl_search_tree::avl_tree_node::rotate_left()
{
if (_right_child != NULL) {
avl_tree_node *new_root = _right_child;
if (_parent != NULL) {
if (_parent->_left_child == this) {
_parent->_left_child = new_root;
} else {
_parent->_right_child = new_root;
}
}
new_root->_parent = _parent;
_parent = new_root;
_right_child = new_root->_left_child;
new_root->_left_child = this;
if (_right_child != NULL) {
_right_child->_parent = this;
}
//update heights
update_height();
new_root->update_height();
return true;
}
return false;
}
대신 난 그냥에 새로 삽입 된 노드를 회전하기 위해 노력하고있어 왼쪽. 오름차순으로 정수를 삽입 한 결과 : 내 트리에는 초기 루트 (삽입 된 첫 번째 노드) 만 포함되고 다른 모든 노드는 유출됩니다.
내가 미쳐 가기 시작하면 문제를 식별하는 데 큰 도움이됩니다.
레코드의 경우 : 회전을 사용하지 않으면 트리가 노드를 누설하지 않으며 정상적인 불균형 이진 검색 트리 (삽입 및 조회 용)로 작동합니다.
편집 : AJG85의 의견에 내가 관찰 추가 할 것입니다 인해 : (내 경우 32 비트 정수에) 내가 키 값을 인쇄합니다 avl_search_tree :: avl_tree_node의 소멸자 방법의 printf '확인'을 추가
을 정리하기 전에, 방금 삽입 한 키를 인쇄 할 avl_search_tree의 삽입 메소드에.
그런 다음 프로그램의 진입 점에서 힙에 avl_search_tree를 할당하고 키를 오름차순으로 추가 한 다음 삭제합니다. 삽입에 성공했다하지만 루트가 삭제 된 thatall 의미
bool avl_search_tree::insert(const int&) : 1
bool avl_search_tree::insert(const int&) : 2
bool avl_search_tree::insert(const int&) : 3
bool avl_search_tree::insert(const int&) : 4
bool avl_search_tree::insert(const int&) : 5
bool avl_search_tree::insert(const int&) : 6
bool avl_search_tree::insert(const int&) : 7
bool avl_search_tree::insert(const int&) : 8
avl_search_tree::avl_tree_node::~avl_tree_node() : 1
: AVL 균형으로
내가 터미널에서 다음과 같은 출력을 얻을 수 있었다.AVL 밸런싱은 일반적인 이진 검색 트리처럼 작동합니다. 터미널 출력은 다음과 같습니다.
bool avl_search_tree::insert(const int&) : 1
bool avl_search_tree::insert(const int&) : 2
bool avl_search_tree::insert(const int&) : 3
bool avl_search_tree::insert(const int&) : 4
bool avl_search_tree::insert(const int&) : 5
bool avl_search_tree::insert(const int&) : 6
bool avl_search_tree::insert(const int&) : 7
bool avl_search_tree::insert(const int&) : 8
avl_search_tree::avl_tree_node::~avl_tree_node() : 1
avl_search_tree::avl_tree_node::~avl_tree_node() : 2
avl_search_tree::avl_tree_node::~avl_tree_node() : 3
avl_search_tree::avl_tree_node::~avl_tree_node() : 4
avl_search_tree::avl_tree_node::~avl_tree_node() : 5
avl_search_tree::avl_tree_node::~avl_tree_node() : 6
avl_search_tree::avl_tree_node::~avl_tree_node() : 7
avl_search_tree::avl_tree_node::~avl_tree_node() : 8
이는 모든 것이 올바르게 정리되었음을 의미합니다.
이제 순환 방법이 문제라는 결론에 어떻게 도달 했습니까? 주석 처리 된 AVL 밸런싱 서브 루틴 아래에서 새로 추가 된 모든 노드를 왼쪽으로 회전시키는 선을 추가했습니다. 결과? AVL Balancing 서브 루틴이 활성화 된 경우와 같습니다.
그리고 update_height() 메서드에 관해서는 어떤 식 으로든 트리 구조를 변경하지 않습니다.
이 내용이 명확 해지기를 바랍니다.
편집 2 :
좀 더 일을 명확히하려면, 자신은 avl_tree_node 소멸자가 구현되는 방법입니다avl_search_tree::avl_tree_node::~avl_tree_node()
{
printf("%s : %d\n", __PRETTY_FUNCTION__, *_key);
if (_left_child != NULL) {
delete _left_child;
}
if (_right_child != NULL) {
delete _right_child;
}
if (_key != NULL) {
delete _key;
}
}
_left_child 및 _right_child는 힙에 할당 된 개체를 avl_tree_node에 대한 포인터입니다.
편집 3 : AGJ85의 2 코멘트에
덕분에 나는이 문제를 발견했다. 내 rotate 메소드에서는 루트가 옮겨 질 때마다 트리의 루트 포인터를 새로운 루트에 실제로 업데이트해야한다는 것을 잊어 버렸습니다.
기본적으로 트리의 루트는 항상 첫 번째 삽입 된 노드를 가리키고 필요할 때 포인터를 업데이트하지 않고 실제로 회전 구성된 새 트리의 루트를 누설시킵니다. :)
감사합니다. AGJ85!
문제의 관련 코드를 붙여 넣는 것이 일반적입니다. 특히 짧은 코드이므로 붙여 넣는 것이 좋습니다. – Xion
문제를 식별 할 수있는 코드/정보가 충분하지 않습니다. 회원의 다른 용도와 방법의 정의는 알려져 있지 않습니다. 이상적으로는 여러분이 관찰 한 내용을 디버깅하고 설명하거나 컴파일 할 수있는 문제를 묘사 한 예제 코드를 제공하는 것이 이상적입니다. – AJG85
AVL 트리를 구현하는 것은 통과 의례, havefun :) 주제에 대해서 : 1) "작동하지 않는다"는 것은 무엇을 의미합니까? 2) 회전 방법은 작동하지 않습니다. 삽입 할 때만 문제가 있습니까? – hugomg