1,题目要求
给定一个升序排列的数组,将其转化为一个高度平衡的二叉搜索树。
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
2,题目思路
这题不会,可以说涉及到二叉树的题目很多都难以下手,因为涉及到了树的性质和递归的设计,难度也是比较高。可以看到只要是涉及到了二叉树的题目LeetCode上面的评分一般都非常的高。
在参考了discuss中的某位高人的代码后,理解了题目的求解思路。
首先,该题目是要生成一个高度平衡的二叉树,思路便是“中分”的办法。每次都去数组的中间元素生成一个节点作为父亲节点,然后让数组左边和右边的元素分别构成父亲节点中的左子树和右子树中的孩子节点。最后重复这一步骤,将其分别应用到左右子树之中即可。
需要注意的是,当数组为空时,返回NULL。当数组长度为1、即不可分时,直接返回该节点作为一个子节点。
3,程序源码
/**
* 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* sortedArrayToBST(vector<int>& nums) {
if(nums.size() == 0) return NULL;
if(nums.size() == 1) return (new TreeNode(nums[0]));
int middle = int(nums.size()/2);
TreeNode *root = new TreeNode(nums[middle]);
vector<int> leftInts(nums.begin(), nums.begin()+middle);
vector<int> rightInts(nums.begin()+middle+1, nums.end());
root->left = sortedArrayToBST(leftInts);
root->right = sortedArrayToBST(rightInts);
return root;
}
};
有一点非常蛋疼的是,在利用vector方法生成向量并进行初始化时,在CLion中会出现下划红线的提示,说该二元操作是不能进行的:vector<int>temp(nums.begin(), nums.begin() + 3);
但是在编译是可以通过的,很神奇。在xcode中也是完全可以编译且不会有错误提示。
vector<int> vec; //声明一个int型向量
vector<int> vec(5); //声明一个初始大小为5的int向量
vector<int> vec(10, 1); //声明一个初始大小为10且值都是1的向量
vector<int> vec(tmp); //声明并用tmp向量初始化vec向量
vector<int> tmp(vec.begin(), vec.begin() + 3); //用向量vec的第0个到第2个值初始化tmp
int arr[5] = {1, 2, 3, 4, 5};
vector<int> vec(arr, arr + 5); //将arr数组的元素用于初始化vec向量
//说明:当然不包括arr[4]元素,末尾指针都是指结束元素的下一个元素,
//这个主要是为了和vec.end()指针统一。
vector<int> vec(&arr[1], &arr[4]); //将arr[1]~arr[4]范围内的元素作为vec的初始值
参考地址:
C++中vector的使用方法