1382. 将二叉搜索树变平衡

· 约 1 分钟阅读 · 次阅读 leetcode

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。

如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 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)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
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