[LeetCode] 450. Delete Node in a BST

寵の児 提交于 2020-03-12 08:40:33

删除二叉搜索树中的节点。题意是给一个二叉搜索树和一个节点key,请将key从BST中删除并维持BST的性质。例子,

Example:

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

    5
   / \
  3   6
 / \   \
2   4   7

Given key to delete is 3. So we find the node with value 3 and delete it.

One valid answer is [5,4,6,2,null,null,7], shown in the following BST.

    5
   / \
  4   6
 /     \
2       7

Another valid answer is [5,2,6,null,4,null,7].

    5
   / \
  2   6
   \   \
    4   7

因为是BST所以查找要删除的节点应该很简单,如果比root小就往左走,比root大就往右走。难点在于删除了节点之后如何维持剩下的节点依然是一个BST。分如下几种情况,

1. 如果要删除的节点没有左子树,则直接用这个节点的右孩子顶上来;

2. 如果要删除的节点没有右子树,则直接用这个节点的左孩子顶上来;

3. 如果要删除的节点有左右子树,需要去右子树里面找出最小的节点顶上来,这个节点是右子树里面最小的左孩子。(参见代码中的findMin函数)找到这个最小的左孩子,替换掉key之后,记得需要把这个节点删去,因为这个节点出现了两次。

时间O(h) - 题目要求

空间O(h) - 题目要求

Java实现

 1 class Solution {
 2     public TreeNode deleteNode(TreeNode root, int key) {
 3         // corner case
 4         if (root == null)
 5             return null;
 6 
 7         // normal case
 8         if (key < root.val) {
 9             root.left = deleteNode(root.left, key);
10         } else if (key > root.val) {
11             root.right = deleteNode(root.right, key);
12         } else {
13             if (root.left == null) {
14                 return root.right;
15             } else if (root.right == null) {
16                 return root.left;
17             }
18             TreeNode minNode = findMin(root.right);
19             root.val = minNode.val;
20             root.right = deleteNode(root.right, root.val);
21         }
22         return root;
23     }
24 
25     private TreeNode findMin(TreeNode node) {
26         while (node.left != null) {
27             node = node.left;
28         }
29         return node;
30     }
31 }

 

JavaScript实现

 1 /**
 2  * @param {TreeNode} root
 3  * @param {number} key
 4  * @return {TreeNode}
 5  */
 6 var deleteNode = function (root, key) {
 7     // corner case
 8     if (root == null) {
 9         return null;
10     }
11 
12     // normal case
13     if (key < root.val) {
14         root.left = deleteNode(root.left, key);
15     } else if (key > root.val) {
16         root.right = deleteNode(root.right, key);
17     } else {
18         if (root.left == null) {
19             return root.right;
20         } else if (root.right == null) {
21             return root.left;
22         }
23         let minNode = findMin(root.right);
24         root.val = minNode.val;
25         root.right = deleteNode(root.right, root.val);
26     }
27     return root;
28 };
29 
30 var findMin = function (node) {
31     while (node.left !== null) {
32         node = node.left;
33     }
34     return node;
35 };

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!