이중 포인터를 사용하여 BST에서 데이터를 제거한 다음 필요한 경우 루트를 변경하는 방법을 파악하는 데 많은 어려움이 있습니다. 이것은 내가 시도하는 것입니다. 그러나 테스트 할 때 제거해서는 안되는 숫자를 제거합니다 ... 결함이 무엇인지에 대한 아이디어가 있습니까?루트 포인터로 가리키는 이진 탐색 트리에서 데이터를 제거하십시오.
편집 : 아래는 내가 문제가 라인 *rootRef = tmp->left;
에있다 생각 대답 한 후 내 새로운 코드 ...
int removeBST(struct TreeNode** rootRef, int data)
{
while (*rootRef && (*rootRef)->data != data)
{
if ((*rootRef)->data > data)
{
rootRef = &(*rootRef)->left;
}
else if ((*rootRef)->data < data)
{
rootRef = &(*rootRef)->right;
}
}
if (*rootRef)
{
struct TreeNode *tmp = *rootRef;
if (rootRef->left == NULL && rootRef->right == NULL) // no children
{
free(tmp);
}
else if (rootRef->left->left == NULL && rootRef->right->right == NULL) // one child
{
rootRef = rootRef->left;
}
else
{
rootRef = inOrderSuccessor(rootRef);
removeBST(**rootRef, data);
}
return 1;
}
return 0;
}
'* rootRef = tmp-> 왼쪽, 왼쪽 포인터를 계속 수행하지만'-> 바로 포인터가 완전한 권리를 포함하여, orphanased됩니다 하위 트리. – wildplasser
이 함수의 경우 의사 코드로 google을 사용할 수 있습니다. 현재 노드 논리를 삭제하는 데 15 %의 가능성이 있습니다. 삭제하려는 노드의 상위 노드에 대한 포인터가 필요하며 삭제할 때 3 개의 유스 케이스가 있습니다. 1. 삭제 될 노드는 잎입니다. 2. 삭제 될 노드는 하나의 자식이 있습니다. 3. 델타 노드는 두 개의 자식이 있습니다. [읽기이] (http://stackoverflow.com/a/12254018/2549281) – Dabo