21xrx.com
2024-11-22 07:44:01 Friday
登录
文章检索 我的文章 写文章
C++实现删除二叉搜索树节点功能
2023-07-02 03:30:57 深夜i     --     --
C++ 删除 二叉搜索树 节点 功能

二叉搜索树是一种非常重要的数据结构,它可以高效地处理查找、插入和删除等操作。C++是一种非常强大的语言,它提供了许多方便的工具和功能,可以轻松实现二叉搜索树的节点删除功能。在本文中,我们将介绍如何使用C++来实现这个功能。

首先,让我们回顾一下二叉搜索树的定义和性质。一棵二叉搜索树是一棵二叉树,它的任何节点的左子树中的值都小于该节点的值,右子树中的值都大于该节点的值。对于任何一个节点,它的左子树和右子树都是一棵二叉搜索树。

在删除二叉搜索树的节点时,我们需要遵循以下步骤:

1. 如果要删除的节点是叶子节点,直接将其删除即可;

2. 如果要删除的节点只有一颗子树,将该节点的子树替换它的位置即可;

3. 如果要删除的节点有两颗子树,需要找到该节点的后继节点(即该节点右子树中最小的节点),将其值赋给该节点,然后将后继节点删除。

接下来,让我们看看如何使用C++来实现这个功能。

1. 删除叶子节点

对于叶子节点,我们只需要将其父节点的左/右指针指向NULL即可。

例如,假设我们要删除二叉搜索树中的节点5:


  7

 / \

5  9

  / \

  8 10

我们可以执行以下代码:


Node *deleteNode(Node *root, int key) {

  if (root == NULL) return NULL;

  if (root->val == key) {

    if (root->left == NULL && root->right == NULL)

      delete root;

      return NULL;

    

  }

  // ...

}

2. 删除只有一颗子树的节点

对于只有一颗子树的节点,我们只需要将该节点的子树替换给它的父节点即可。

例如,假设我们要删除二叉搜索树中的节点7:


  7

 / \

5  9

  / \

  8 10

删除节点7之后,它的子节点5就应该替换成节点9的子节点:


  9

 / \

5  10

  /

  8

我们可以执行以下代码:


Node *deleteNode(Node *root, int key) {

  if (root == NULL) return NULL;

  if (root->val == key) {

    if (root->left == NULL && root->right == NULL)

      delete root;

      return NULL;

    

    if (root->left == NULL) {

      Node *newRoot = root->right;

      delete root;

      return newRoot;

    }

    if (root->right == NULL) {

      Node *newRoot = root->left;

      delete root;

      return newRoot;

    }

  }

  // ...

}

3. 删除有两颗子树的节点

对于有两颗子树的节点,我们需要找到该节点的后继节点(即该节点右子树中值最小的节点),将其值赋给该节点,然后将后继节点删除。

例如,假设我们要删除二叉搜索树中的节点7:


  7

 / \

5  9

  / \

  8 10

删除节点7之后,它的后继节点是节点8,于是我们将节点8的值赋给节点7:


  8

 / \

5  9

   \

   10

然后我们可以删除节点8:


  9

 / \

5  10

  /

  8

我们可以执行以下代码:


Node *findMin(Node *root) {

  while (root->left != NULL)

    root = root->left;

  

  return root;

}

Node *deleteNode(Node *root, int key) {

  if (root == NULL) return NULL;

  if (root->val == key) {

    if (root->left == NULL && root->right == NULL)

      delete root;

      return NULL;

    

    if (root->left == NULL) {

      Node *newRoot = root->right;

      delete root;

      return newRoot;

    }

    if (root->right == NULL) {

      Node *newRoot = root->left;

      delete root;

      return newRoot;

    }

    Node *successor = findMin(root->right);

    root->val = successor->val;

    root->right = deleteNode(root->right, root->val);

  } else if (root->val > key) {

    root->left = deleteNode(root->left, key);

  } else {

    root->right = deleteNode(root->right, key);

  }

  return root;

}

到此为止,我们已经成功地实现了二叉搜索树的节点删除功能。在实际应用中,我们可以根据自己的需求对代码进行修改和优化,以满足不同的需求。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复