recursive delete on a binary tree

后端 未结 2 1629
夕颜
夕颜 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: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;
    }
    

提交回复
热议问题