【问题标题】:How to delete children of a tree如何删除树的孩子
【发布时间】:2012-05-05 13:02:21
【问题描述】:

我需要删除除根之外的前缀树的所有子级。我不问任何代码。我只需要一个方法来遍历和删除树的所有子节点。

【问题讨论】:

    标签: c++ algorithm tree theory prefix-tree


    【解决方案1】:

    您可以使用后序遍历来遍历树并删除节点为:

    function deleteTree(node, tree_root) {
         if (node != null) {
             // recursively delete left sub-tree.
             deleteTree(node->left, tree_root);
    
             // recursively delete right sub-tree.
             deleteTree(node->right, tree_root);
    
             // time to delete the node..but only if it's not root.
             if( node != tree_root) {
                  delete node;
             }  
         }
    }
    

    并将上述函数调用为:

    deleteTree(root,root);
    

    【讨论】:

      【解决方案2】:

      写一个方法delete,它接受一个树节点:

       for each child in node
         call delete on child
         remove child from node
         free child
      

      对于根的每个孩子调用这个删除方法。

      【讨论】:

        【解决方案3】:

        有趣的是,你可能会做一些优雅的事情——删除后可能不会使用树,所以你可以编写一个节点的析构函数:

        struct Node // Non-copyable!
        {
          Node *left, *right;
        
          Node()
            : left(NULL)
            , right(NULL)
          {
          }
          ~Node()
          {
            delete left;
            delete right;
          }
        };
        

        仅此而已!你使用它:delete root。请注意,您可能不会在 delete 之前测试 NULL,因为它按照 C++ 标准运行良好(只是返回)。

        【讨论】:

        • 删除后需要使用root。
        • 好的,这个方法很好:void DeleteChildren() { delete left; delete right; } :) 与上面的方法不同,你应该测试node != NULL
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多