2012-03-30 6 views
2

포인터를 사용하여 수동으로 이진 트리를 구현해야하는 할당이 있습니다. 내 나무는 두 자녀와 함께 삭제 될 때까지 잘 작동합니다. 그 시점에서 내가 끝내는 것은 올바른 항목이 제거되고 올바른 항목이 제거 된 항목의 위치에 놓이게되지만 왼쪽 자식이 잘못된 포인터가되어 결국 내가 알아낼 수 없게됩니다. 이것을 망쳐 놓고있다. 이 코드는 과제이므로 여기에 모든 코드를 게시하고 싶지는 않지만 여기에 문제가있는 코드가 있습니다. 누군가가 나를 위해 코드를 작성하지 않고 실수를 저질렀다는 것을 알려 주시면 정말로 감사하겠습니다. 또한 내가 테스트하고있는 트리는 대략 이와 비슷하게 보이고 노드 3을 제거하려고합니다. 노드 2가 있어야하지만 노드 2는 노드 2입니다.이 경우이 문제를 해결하는 방법을 알 수 있습니다. 하지만 대체 노드가 직접적인 자식이 아니 었으면 엉망이되어서 내가 뭘 잘못하고 있는지 보지 못했습니다. 내가 잘 이해하거나 문제를 해결 가까이 오지 않는다 이론에 대한 중 회담를 참조 모든 때문에 어떤 도움바이너리 트리에서 두 개의 하위 삭제

 5 
    / \ 
    3  7 
/\ /\ 
2 4 6 8 
/ 
3.5 

temp = delItem->left; 
back = delItem; 
while(temp->right != NULL) 
{ 
    back = temp; 
    temp = temp->right; 
} 

returnItem->m_dValue = delItem->m_dValue; 
returnItem->m_dWeight = delItem->m_dWeight; 
returnItem->m_iType = returnItem->m_iType; 
strcpy(returnItem->m_sDesc,delItem->m_sDesc); 
strcpy(returnItem->m_sItemName,delItem->m_sItemName); 
returnItem->left = delItem->left; 
returnItem->right = delItem->right; 
delItem = temp; 
delItem->left = returnItem->left; 
delItem->right = returnItem->right; 
returnItem->left = NULL; 
returnItem->right = NULL; 
     /*delItem->left = left; 
     delItem->right = right;*/ 
if(back == delItem) 
{ 
    back->left = temp->left; 
} 
else 
{ 
    back->right = temp->left; 
} 
temp->left = NULL; 
temp->right = NULL; 
delete temp; 
return returnItem; 

감사합니다. 이진 트리에서 항목을 제거 지미

+0

당신이 변수를 사용하는 무엇 ? dWeight와 iType은 무엇을 의미합니까? 당신은 단지 "바이너리 트리 (binary tree)"또는 블랙 & 레드 (black & red) 또는 AVL과 같은 특정 구현을 언급하고 있습니까? –

답변

1

많은 인터넷을 통해 장소 (교과서)에 덮여있다.

코드 예제를 제공하기 때문에이 링크를 살펴 보시기 바랍니다. 알고리즘이므로 알고리즘을 이해하는 것이 매우 중요합니다. 알고리즘은 과제이므로 알고 있어야하며 앞으로 테스트 할 수 있습니다.

Binary search tree. Removing a node

Binary Tree – Deleting a Node

+0

나는 알고리즘을 완벽하게 이해하고 이미 테스트를 마쳤으며 100을 만들었다. 나는 또한 내가하려고하는 것을 알고있다. 나는 가장 오른쪽 항목에 왼쪽 지점을 따라 가려고 시도하고 있는데, 이것은 성공적으로 수행됩니다. 또한 알고리즘을 기반으로 어떤 노드를 아이들에게 설정할지 알고 있습니다. 내가보기에는 내가 그 일을하는 데 실수 한 것이있다. 나는 수십 개의 웹 사이트와 모든 책을 읽었습니다. 설명 문제가 아닙니다. 그것은 잘못된 포인터를 설정하고 그 일이 어디 있는지 볼 수 없다는 것입니다. 나는 게시하기 전에 이들 사이트 모두에 있었다. – Jimmy

관련 문제