和Convert Sorted List to Binary Search Tree(相关思路http://blog.youkuaiyun.com/menyangyang/article/details/38681361)思路一致,这题涉及数组会更简单些。
第一次做时候的代码
class Solution
{
public:
TreeNode *sortedArrayToBST(vector<int> &num)
{
int len = num.size();
TreeNode *treeHead = NULL;
if(len==0)
return treeHead;
return sortedListToBSTHelper(num, 0, len-1);
}
TreeNode *sortedListToBSTHelper(vector<int> &num, int start, int end)
{
TreeNode *treeNode = NULL;
treeNode = new TreeNode(0);
// 当前数组中只有一个元素的情况
if(start==end)
{
treeNode->val = num[start];
return treeNode;
}
//当前数组中有两个元素的情况
if(end == start+1)
{
treeNode->val = num[start];
TreeNode *Node = new TreeNode(num[end]);
treeNode->right = Node;
return treeNode;
}
int mid = (start+end)/2;
treeNode->val = num[mid];
//递归找到中间元素的左右结点
treeNode->left= sortedListToBSTHelper(num, start, mid-1);
treeNode->right = sortedListToBSTHelper(num, mid+1, end);
return treeNode;
}
};
Try2
上述代码特别处理了数组只有一个和两个元素的情况,其实不用单独分开,直接处理即可
代码
class Solution
{
public:
TreeNode *sortedArrayToBST(vector<int> &num)
{
TreeNode *head = NULL;
int n = num.size();
if(n==0)
return head;
return sortedArrayToBSTHelper(num, 0, n-1);
}
TreeNode* sortedArrayToBSTHelper(vector<int> &num, int left, int right)
{
TreeNode *head = NULL;
if(left>right)
return head;
head = new TreeNode(0);
int mid = (left+right)/2;
head->val = num[mid];
head->left = sortedArrayToBSTHelper(num, left, mid-1);
head->right = sortedArrayToBSTHelper(num, mid+1, right);
return head;
}
};