删除二叉搜索树

时间:2017-03-07 21:06:11

标签: c binary-search-tree destructor

我正在尝试删除整个二叉搜索树(树中的每个节点),您认为其中一个功能会更好吗?

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;
    }

1 个答案:

答案 0 :(得分:0)

建议的析构函数~BST()destroyTree()的建议函数class BST都不会删除BST实例,并且会比另一个更好。

解释1 - 析构函数~BST()正在做什么?

  

建议的来源很简单delete root->left;后跟delete root->right;,只会删除BinarySearchTree的2个节点。

  1. 节点root未检查为NULL,否则永远不会被删除,
  2. 节点root->left也不用NULL检查,
  3. 节点root->right也不用NULL检查,
  4. 解释2 - 函数destroyTree()正在做什么?

      

    两个while循环尝试探索树,一个用于左侧   分支和一个分支。条件(tree != NULL)是   仅出现在退出循环但不检查当前是否存在   节点可以删除。

    1. 使用左侧循环时,只有->left的{​​{1}}个节点将被删除,直到root->left CRASH 才会尝试tree->left == NULL,< / LI>
    2. 在向右循环调用delete tree;新的 CRASH 之前添加if (tree==NULL) break;以退出循环之后,
    3. 最后delete tree;是无意义的,因为在此位置,delete tree;总是&#39; == NULL`。
    4. 奖金解决方案 - 基于功能tree的修改。

        

      递归函数将是删除所有已创建函数的最简单方法   和插入的节点。但请注意BinarySearchTree的大小   尤其是最深的分支。

      destroyTree()