描述
给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树。
There may exist multiple valid solutions, return any of them.
样例
给出数组 [1,2,3,4,5,6,7]
, 返回
4 / 2 6 / / 1 3 5 7
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/*
* @param A: an integer array
* @return: A tree node
*/
TreeNode * sortedArrayToBST(vector<int> &A) {
// write your code here
if (A.empty())
{
return NULL;
}
int ed=A.size()-1;
int mid=ed/2;
TreeNode * newroot=builtTree(A,0,ed);
return newroot;
}
TreeNode * builtTree(vector<int> &A,int st,int ed)
{
if (st>ed)
{
return NULL;
}
int mid=(st+ed)/2;
TreeNode * newroot=new TreeNode(A[mid]);
newroot->left=builtTree(A,st,mid-1);
newroot->right=builtTree(A,mid+1,ed);
return newroot;
}
};
此外,对于这种牵涉数组首尾位置的运算,最好能令首尾位置作为形参参与运算。例如之前我们见到的“搜索区间”的问题(详见:点击打开链接)就是在求左右两侧的界限时,将数组一分为二,分别令首尾位置作为形参。这是一种标准的解决办法!
那么,这道题就不难了,也采取定义新的辅助函数的方法,将首尾位置作为形参。 转自此文
其他参考:https://blog.csdn.net/lfj17/article/details/70146866
TreeNode *newroot=new TreeNode(A[mid]);//第一个节点;
newroot->left=builtTree(A,0,mid-1);
newroot->right=builtTree(A,mid+1,ed);
void buildTree(TreeNode * newroot, vector<int> &A,int st,int ed)
{
if (st>ed)
{
return ;
}
int mid=(st+ed)/2;
newroot=new TreeNode(A[mid]);
buildTree(newroot->left,A,st,mid-1);
buildTree(newroot->right,A,mid+1,ed);
}
/* --------- sortedArrayToBST函数内调用 --------- */
TreeNode * newroot=NULL;
builtTree(newroot,A,0,ed);
//int ed=A.size()-1;
//int mid=ed/2;
//TreeNode *newroot=new TreeNode(A[mid]);//第一个节点;
//builtTree(newroot->left,A,0,mid-1);
//builtTree(newroot->right,A,mid+1,ed);
即指针做形参,并且在函数内通过new来给形参赋值。但这样做是没用的,因为地址值传递不到实参那里,所以运行程序直接返回了NULL。在sortedArrayToBST内创建根节点运行后只返回数组中间值。