
这个题乍一看真的没什么思路,因为平衡二叉树自古以来就是老大难问题,如何建立的时候就平衡,这需要一些贪心的思想。
这个题目的官方题解写的非常好,这个题其实是一个不断二分的过程,每次找中间节点,左边的分到左子树,右边的分到右子树,一致这样递归二分下去即可。但是如果一直是奇数节点还好说,如果出现偶数节点呢?我们应该选择左边还是右边的节点?
这个就是一种贪心思想,答案是怎么选都无所谓,都可以让这棵树尽可能的平衡。
cpp
/**
* 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) {}
* };
*/
typedef vector<int> V;
class Solution {
public:
TreeNode* dfs(V& nums, int l, int r)
{
if(l > r)return nullptr;
int mid = l + (r-l)/2;
TreeNode *n = new TreeNode(nums[mid]);
n->left = dfs(nums, l, mid-1);
n->right = dfs(nums, mid+1, r);
return n;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
int n = nums.size();
int mid = 0 + (n-1)/2;
TreeNode *root = new TreeNode(nums[mid]);
root->left = dfs(nums, 0, mid-1);
root->right = dfs(nums, mid+1, n-1);
return root;
}
};