Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST.
Basically, the deletion can be divided into two stages:
- Search for a node to remove.
- If the node is found, delete the node.
Note: Time complexity should be O(height of tree).
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
/** * 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) return NULL; if(root->val>key) { root->left = deleteNode(root->left, key); }else if(root->val<key) { root->right = deleteNode(root->right, key); }else { if(!root->left || !root->right) { root = (root->left) ? root->left : root->right; }else { TreeNode * cur = root->right; while(cur->left) { cur = cur->left; } root->val = cur->val; root->right = deleteNode(root->right, cur->val); } } return root; } };
非递归:class Solution { public: TreeNode* deleteNode(TreeNode* root, int key) { TreeNode *cur = root, *pre = NULL; while (cur) { if (cur->val == key) break; pre = cur; if (cur->val > key) cur = cur->left; else cur = cur->right; } if (!cur) return root; if (!pre) return del(cur); if (pre->left && pre->left->val == key) pre->left = del(cur); else pre->right = del(cur); return root; } TreeNode* del(TreeNode* node) { if (!node->left && !node->right) return NULL; if (!node->left || !node->right) { return (node->left) ? node->left : node->right; } TreeNode *pre = node, *cur = node->right; while (cur->left) { pre = cur; cur = cur->left; } node->val = cur->val; (pre == node ? node->right : pre->left) = cur->right; return node; } };
本文介绍了一种从二叉搜索树(BST)中删除指定键的方法。文章提供了两种实现方式,一种为递归实现,另一种为非递归实现。递归实现中详细解释了搜索并删除指定节点的过程,而非递归实现则通过遍历找到目标节点,并进行了相应的删除操作。
254

被折叠的 条评论
为什么被折叠?



