2017-10-25 1 views
-3

내 C 프로그램에서 작동하지 :루트 = NULL 내가 트리에서 노드를 삭제하려면 다음 함수를 만든

void delNode(int key, Node *root) { 
    if(root->data != key && root->left != NULL) { 
    delNode(key,root->left); 
    } 
    if(root->data != key && root->right != NULL) { 
    delNode(key,root->right); 
    } 
    if(root->data != key && root->left == NULL) { 
    return; 
    } 
    if(root->data != key && root->right == NULL) { 
    return; 
    } 
    if(root->data == key) { 
    root = NULL; 
    return; 
    } 
} 

나는이 통과

void printInorder(Node *root) { 
    if(root!=NULL) { 
    printInorder(root->left); 
    printf("%d ",root->data); 
    printInorder(root->right); 
    } 
} 

에 대한 다음과 같은 기능 삭제 된 노드가 표시된 경우에도 & 트리를 표시합니다.

PS : 나는 노드를 삭제하지 않습니다 루트

+0

이 우리를보기 -이 : 나는 당신이 방법은 아래를 참조이 함께 시도 해결 한 그 구조와 모든 요소를 ​​만드는 노드). –

+0

모든 경고와 디버그 정보로 컴파일 : [gcc] (http://gcc.gnu.org/)로'gcc -Wall -Wextra -g'. ** 디버거 **'gdb' (그리고'valgrind')를 사용하십시오. fix-my-code 질문은 주제와 관련이 없습니다. –

+1

'root '는 트리의 노드를 가리키는 포인터입니다. 'root'에 NULL을 할당하면 그 노드가 삭제된다는 의미는 아니지만'root' 포인터와 노드를 가르키는 링크를 끊지 만'left' 또는'right' 포인터는 여전히 그 포인터를 가리키고 있습니다 마디. 삭제하려면'free (root) '해야합니다. 하지만 해제하는 것만으로는 충분하지 않습니다. 부모 노드와 해제 된 노드 사이의 연결을 끊을 필요가 있습니다 (NULL을 각각의 '왼쪽'또는 '오른쪽'포인터에 할당). 귀하의'delNode()'함수가 불완전합니다. –

답변

1

이 같은 노드를 유지 전체 트리를 삭제하려면, 루트는 메모리 위치에 단지 참조입니다.
여기에 간단한 설명이 있습니다.
그래서 root 상자의 화살표처럼, 일부 상자 (메모리 위치)에 화살표를 가리키며 일부 내용이있는 box1이 표시됩니다. 여기 root = NULL 당신은 아무 것도 보이지 않는 빈 공간을 가리키는 화살표를 가리키고 있지만 상자 1에는 여전히 내용이 들어 있습니다. 무엇 당신이 할 필요가

는 또한 트리 노드 삭제로 논리/결함이 불완전 (아마 불완전) 인 BOX1

free(root); //This is make memory space available, i.e deallocates the memory 

의 내용을 삭제,하지만 난 당신이 이미 알고 생각합니다.

+0

free (root)는 루트가 가리키는 위치의 존재를 제거합니다. –

+0

NULL이어야 함으로 나타 내기 바란다. –

+0

@PrajvalM 노드가 존재하고 NULL이어야한다는 것은 의미가 없으며, 자신과 모순된다. –

0

방법이 올바르지 않습니다. 트리에서 노드를 삭제하는 것은 그렇게 간단하지 않습니다. 삭제할 노드의 왼쪽 하위 트리와 오른쪽 하위 트리를 어떻게 처리 할 것인지 고려하십시오. root= NULL;을 할당하면 아무 것도 얻지 못할 것입니다. free (root)를 사용 함으로서 현재는 아무 것도 얻을 수 없지만 현재 가리키는 root의 자식 노드 (자식 트리)를 영구적으로 삭제할 수 있습니다.

Node* delNode(int key, Node *root) { 
     Node *nodeToBeDeleted=NULL 
     Node *predecessor = root; 
     if(root->data != key && root->left != NULL) { 
     nodeToBeDeleted = delNode(key,root->left); 
     if(nodeToBeDeleted){ //if we found the node to be deleted in left sub tree 
      if(nodeToBeDeleted->right != NULL){ 
      root->left = nodeToBeDeleted->right; 
      predecessor = findPredecessor(root->right); 
      predecessor->left = nodeToBeDeleted->left; 
      }   
      else{ 
      root->left = nodeToBeDeleted->left; 
      } 
      free(nodeToBeDeleted); 
     } 
     } 
     if(root->data != key && root->right != NULL) { 
     nodeToBeDeleted = delNode(key,root->right); 
     if(nodeToBeDeleted){ //if we found the node to be deleted in the right sub tree 
      if(nodeToBeDeleted->right != NULL){ 
      root->right = nodeToBeDeleted->right; 
      predecessor = findPredecessor(root->right); 
      predecessor->left = nodeToBeDeleted->left; 
      }   
      else{ 
      root->right = nodeToBeDeleted->left; 
      } 
      free(nodeToBeDeleted); 
     } 
     } 
     if(root->data != key && root->left == NULL) { 
     return NULL; 
     } 
     if(root->data != key && root->right == NULL) { 
     return NULL; 
     } 
     if(root->data == key) { 
     return root; 
     } 

    } 

트리의 이전 노드를 찾기 위해 아래의 방법을 추가 루트가 도다 어떤 요소 (노드는, 우리에게 보여

Node* findPredecessor(Node *root) { 
    Node *predecessor = root; 
     if(root!=NULL) { 
     predecessor = findPredecessor(root->left); 
     } 
     if(predecessor == NULL) 
      return root; 
     else 
      return predecessor; 
    } 
관련 문제