一、问题描述
给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树。
样例
给出数组 [1,2,3,4,5,6,7]
, 返回
4
/ \
2 6
/ \ / \
1 3 5 7
运用二分法以及递归的思想,一开始l为最左边的数值,r为最右边的数值,然后进行二分,找到中间值mid,使其作为根节点,然后左子树为最左边的值与mid-1相加除二,右子树的值为最右边的值与mid+1相加除二,运用递归依次进行下去即可返回要求的排序二叉树。
三、我的代码
class Solution {
public:
/**
* @param A: A sorted (increasing order) array
* @return: A tree node
*/
TreeNode *sortedArrayToBST(vector<int> &A) {
if(A.size()==0) return NULL;
else
{
return find(A,0,A.size()-1);
}
}
TreeNode*find(vector<int>&A,int l,int r)
{
if(l>r) return NULL;
int mid=(l+r)/2;
TreeNode *root=new TreeNode(A[mid]);
root->left=find(A,l,mid-1);
root->right=find(A,mid+1,r);
return root;
}
};
四、我的感想
这道题一开始没有想出来,一开始只觉得用中序遍历最后的树返回的即为一开始的数组,没有考虑到运用二分法,后来请教了大神,才知道应该这么做,还是自己平时做题太少,接触到的东西太少了,不过又掌握了一项新技能感觉还是不错的。