给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
示例 1:
输入:root = [1,null,2,null,3,null,4,null,null]
输出:[2,1,3,null,null,null,4]
解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。
示例 2:
输入: root = [2,1,3]
输出: [2,1,3]
中序遍历
可以利用 二叉搜索树中序遍历的结果是有序数组的特点,先得到有序数组,然后在构建平衡二叉搜索树
时间空间复杂度均为O(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
class Solution { void inOrder(TreeNode* root, vector<int> &nums) { if (root == nullptr) return; inOrder(root->left, nums); nums.emplace_back(root->val); inOrder(root->right, nums); }
TreeNode* buildBST(const vector<int> &nums, int left, int right) { if (left > right) return nullptr; int mid = left + (right-left)/2; TreeNode* root = new TreeNode(nums[mid]); root->left = buildBST(nums, left, mid-1); root->right = buildBST(nums, mid+1, right); return root; } public: TreeNode* balanceBST(TreeNode* root) { vector<int> inOrderNums; inOrder(root, inOrderNums); return buildBST(inOrderNums, 0, inOrderNums.size()-1); } };
|
插入时旋转
TODO