2017-03-07 9 views
0

전체 바이너리 검색 트리 (트리의 모든 노드)를 삭제하려고하는데,이 중 어느 기능이 더 잘 작동 할 것이라고 생각하십니까?바이너리 검색 트리 삭제

private: 
    struct Node { 
     string value; 
     Node* left; 
     Node* right; 
    }; 
    Node* root; 

public: 
    BST() { 
     root = NULL; 
    } 

    ~BST() { 
     delete root->left; 
     delete root->right; 
    } 

나 :

... 
    void destroyTree (Node*& tree) { 
     while (tree != NULL) { 
      tree = tree->left; 
      delete tree; 
     } 
     while (tree != NULL) { 
      tree = tree->right; 
      delete tree; 
     } 
     delete tree; 
    } 
+0

시청자 수를 최대화하려면 ** 'C'** 태그를 추가하십시오. –

+0

@ J.Piquard 만약 여러분이 언어를 인식 할 수 있다면 자신 만의 태그를 달 수 있습니다. – Bergi

+0

@Bergi, 실제로 ** 'C++'** 태그는 부분적인'class BST' 선언이있는 올바른 것입니다. –

답변

0

어느 제안 소멸자 ~BST()이나 class BSTdestroyTree()는 BST 인스턴스를 삭제하고 다른 것보다 더 좋을 것이다 제안 된 기능.

설명 1 - 소멸자 ~BST()은 무엇을하고 있습니까?

제안 된 소스는 delete root->left;delete root->right; 다음과 BinarySearchTree의 2 노드를 삭제합니다 간단하다. 노드 root->right이 너무 NULL 확인되지

    1. 노드 root가 삭제되지 않습니다, 그렇지 않으면 NULL 확인되지 않고
    2. ,
    3. root->left 너무 NULL 확인되지 않은 노드,

    설명 2 - destroyTree()의 기능은 무엇입니까?

    트리를 탐색하기 위해 두 개의 while 루프가 있습니다. 하나는 왼쪽 브랜치이고 다른 하나는 올바른 브랜치입니다. 조건 (tree != NULL)은 루프에서 빠져 나오기 위해서만 존재하는 이지만 현재 노드가 삭제 될 수 있는지는 확인하지 않습니다. 왼쪽 루프와

    1. root->left->left 노드 tree->left == NULLCRASHdelete tree; 할 때까지 삭제됩니다
    2. 심지어 delete tree;를 호출하기 전에 루프를 종료 할 if (tree==NULL) break;을 추가 한 후 새로운 크래시 오른쪽 루프,
    3. 그리고 마지막으로 delete tree;은이 위치에 있기 때문에 의미가 없습니다 tree은 항상 '== NULL`입니다.

    보너스 해결 - 함수 destroyTree()의 변형에 기초하여.

    순환 함수는 만들어진 모든 노드와 노드를 삽입하는 가장 간단한 방법입니다. 그러나 BinarySearchTree 의 크기와 특히 가장 깊은 지점을 알고 있어야합니다.

    void destroyTree(Node *cur_node) { 
        if (cur_node!=NULL) { 
         // explore and delete on left 
         destroyTree(cur_node->left); // recursive-call 
         // explore and delete on right 
         destroyTree(cur_node->right); // recursive-call 
         // delete each node 
         delete cur_node; 
        } 
    }