LeetCode Convert Sorted Array to Binary Search Tree
Convert Sorted Array to Binary Search Tree
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
一看题目,就感觉需要用二分法来做,因为数组是排序的,对应生成的树也要是二分搜索树。
具体分许见代码注释
//flag=1表示若此次调用成功,则是root的左子树接点;flag=2表示若此次调用成功,则是root的右子树节点
void ArrayToBST(TreeNode* root, vector<int>& num, int left, int right, int flag)
{
//left==num.size()/2 || right==num.size(),由于中间节点在程序最开始的时候已经创建,因此这里需要排除,免得重复
if (left > right || left==num.size()/2 || right==num.size())
return;
//创建节点,并挂在root下
TreeNode* pNode = NULL;
if (left == right)
{
pNode = new TreeNode(num[left]);
pNode->left = pNode->right = NULL;
if (flag == 1)
root->left = pNode;
else
root->right = pNode;
return;
}
int mid = (left + right) / 2;
pNode = new TreeNode(num[mid]);
pNode->left = pNode->right = NULL;
if (flag == 1)
root->left = pNode;
else
root->right = pNode;
//构建该节点的左子树
ArrayToBST(pNode, num, left, mid-1, 1);
//构建该节点的右子树
ArrayToBST(pNode, num, mid+1, right, 2);
}
TreeNode *sortedArrayToBST(vector<int> &num)
{
if (num.size() == 0)
return NULL;
int n = num.size();
TreeNode* root = new TreeNode(num[n/2]);
root->left = root->right = NULL;
//构建根节点的左子树
ArrayToBST(root, num, 0, n/2, 1);
//构建根节点的右子树
ArrayToBST(root, num, n/2+1, n-1, 2);
return root;
}
以上代码不够简洁,经过网上的参考,优化之后的代码
TreeNode* buildTree(vector<int> &num, int left, int right)
{
if (left > right)
return NULL;
int mid = left + right / 2;
TreeNode* leftNode = buildTree(num, left, mid);
TreeNode* rightNode = buildTree(num, mid + 1, right);
TreeNode* node = new TreeNode(num[mid]);
node->left = leftNode;
node->right = rightNode;
return node;
}
TreeNode *sortedArrayToBST(vector<int> &num)
{
return buildTree(num, 0, num.size() - 1);
}