1. Flatten to Sorted Array, Remove Key, Rebuild Balanced BST
Intuition
Perform an inorder traversal to obtain an array of sorted values. If the key exists, filter it out. Then reconstruct a balanced BST using the midpoint divide-and-conquer algorithm. While correct, this takes O(N) time and O(N) auxiliary space, which destroys the O(H) efficiency expected for BST operations.
When to apply: Fallback approach when tree structural rebalancing is completely unmanaged.
Algorithm
- Extract all nodes via inorder traversal into an array, remove the target key, and reconstruct a new BST from the remaining sorted array.
#include <iostream>#include <vector> struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}}; class Solution { void inorder(TreeNode* root, std::vector<int>& vals) { if (!root) return; inorder(root->left, vals); vals.push_back(root->val); inorder(root->right, vals); } TreeNode* build(const std::vector<int>& vals, int l, int r) { if (l > r) return nullptr; int mid = l + (r - l) / 2; TreeNode* node = new TreeNode(vals[mid]); node->left = build(vals, l, mid - 1); node->right = build(vals, mid + 1, r); return node; }public: TreeNode* deleteNode(TreeNode* root, int key) { std::vector<int> vals; inorder(root, vals); std::vector<int> filtered; for (int v : vals) { if (v != key) filtered.push_back(v); } return build(filtered, 0, (int)filtered.size() - 1); }}; int main() { TreeNode* root = new TreeNode(5); root->left = new TreeNode(3); root->right = new TreeNode(6); root->left->left = new TreeNode(2); root->left->right = new TreeNode(4); root->right->right = new TreeNode(7); Solution sol; TreeNode* res = sol.deleteNode(root, 3); std::cout << "New Root: " << res->val << " (Left: " << res->left->val << ", Right: " << res->right->val << ")" << std::endl; return 0;}Time & Space Complexity
- Time complexity:
O(N) - Space complexity:
O(N)