领扣(leetcode)

Delete Node in a BST

2018-09-30  本文已影响0人  莫小鹏

题目描述

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。

示例:

root = [5,3,6,2,4,null,7]
key = 3

    5
   / \
  3   6
 / \   \
2   4   7

给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。

一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。

    5
   / \
  4   6
 /     \
2       7

另一个正确答案是 [5,2,6,null,4,null,7]。

    5
   / \
  2   6
   \   \
    4   7

分析

删除要比我们前面提到过的两种操作复杂许多。有许多不同的删除节点的方法,这篇文章中,我们只讨论一种使整体操作变化最小的方法。我们的方案是用一个合适的子节点来替换要删除的目标节点。根据其子节点的个数,我们需考虑以下三种情况:

  1. 如果目标节点没有子节点,我们可以直接移除该目标节点。
  2. 如果目标节只有一个子节点,我们可以用其子节点作为替换。
  3. 如果目标节点有两个子节点,我们需要用其中序后继节点或者前驱节点来替换,再删除该目标节点,或者把目标节点的左子树移动到后继节点的左子树上,返回目标节点的右节点。
    找后继节点的方式:找到目标节点的右子树的最小节点,循环一直找右子树的左节点,直到左节点为空。

代码

 /**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 
class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root == NULL) {
            return NULL;
        }
        if(key < root->val) {
            root->left = deleteNode(root->left, key);
        } else if (key > root->val){
            root->right = deleteNode(root->right, key);
        } else  {
            if(root->left == NULL || root->right == NULL) {
                TreeNode* cur = root->left != NULL ? root->left : root->right;
                delete root;
                return cur;
            } else {
                //返回root的右子树,把root的左子树移动到右子树最小的节点上
                TreeNode *right = root->right;
                TreeNode *cur = right;
                while(cur->left != NULL) {
                    cur = cur->left;
                }
                cur->left = root->left;
                delete root;
                return right;
            }
        }
        return root;
    }
};

题目链接

https://leetcode-cn.com/explore/learn/card/introduction-to-data-structure-binary-search-tree/65/basic-operations-in-a-bst/180/

上一篇 下一篇

猜你喜欢

热点阅读