recursive delete on a binary tree

后端 未结 2 1630
夕颜
夕颜 2021-01-05 07:59

I am trying to understand how the recursive method of deletion of a binary search tree works. The code that I came across in many places looks as follows:

vo         


        
相关标签:
2条回答
  • 2021-01-05 08:32

    It looks like this at that point:

    void destroy_tree(struct node *leaf_5)
    {
      if( leaf_5 != 0 )  // it's not
      {
          destroy_tree(leaf_5->left); // it's NULL so the call does nothing
          destroy_tree(leaf_5->right); // it's NULL so the call does nothing
          free( leaf_5 );  // free here
      }
    }
    

    Nothing is required to return... the "history" of the steps is on the call stack, which looks something like this at that point:

    destroy_tree(leaf_10)
      destroy_tree(leaf_10->left, which is leaf_6)
        destroy_tree(leaf_6->left, which is leaf_5)
    

    So after leaf_5 is gone, it goes back up the stack and does destroy_tree(leaf_6->right, which is leaf_8)... etc...

    0 讨论(0)
  • 2021-01-05 08:53

    This is how the function basically works:

    void destroy_tree(struct node *leaf)
    {
      if( leaf_5 != 0 )  // it's not
      {
          destroy_tree(leaf->left); 
           // Traverse the tree all the way left before any of the code below gets executed.
          destroy_tree(leaf->right); 
           // Traverse the tree all the way right from the final left node before any of 
           //the code below gets executed
          free( leaf );  // Free the final node
      }
    }
    

    Below is code for how a full implementation of recursive delete should look:

    void DeleteNode(TreeNode*& tree);
    void Delete(TreeNode*& tree, ItemType item);
    void TreeType::DeleteItem(ItemType item)
    // Calls the recursive function Delete to delete item from tree.
    {
    Delete(root, item);
    }
    void Delete(TreeNode*& tree, ItemType item)
    // Deletes item from tree.
    // Post: item is not in tree.
    {
    if (item < tree->info)
    Delete(tree->left, item); // Look in left subtree.
    else if (item > tree->info)
    Delete(tree->right, item); // Look in right subtree.
    else
    DeleteNode(tree); // Node found; call DeleteNode.
    }
    
    
    void GetPredecessor(TreeNode* tree, ItemType& data);
    void DeleteNode(TreeNode*& tree)
    // Deletes the node pointed to by tree.
    // Post: The user's data in the node pointed to by tree is no
    // longer in the tree. If tree is a leaf node or has only one
    // non-NULL child pointer, the node pointed to by tree is
    // deleted; otherwise, the user's data is replaced by its
    // logical predecessor and the predecessor's node is deleted.
    {
    ItemType data;
    TreeNode* tempPtr;
    tempPtr = tree;
    if (tree->left == NULL)
    {
    tree = tree->right;
    delete tempPtr;
    }
    else if (tree->right == NULL)
    {
    tree = tree->left;
    delete tempPtr;
    }
    else
    {
    GetPredecessor(tree->left, data);
    tree->info = data;
    Delete(tree->left, data); // Delete predecessor node.
    }
    }
    
    void GetPredecessor(TreeNode* tree, ItemType& data)
    // Sets data to the info member of the rightmost node in tree.
    {
    while (tree->right != NULL)
    tree = tree->right;
    data = tree->info;
    }
    
    0 讨论(0)
提交回复
热议问题