牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案
题目描述
给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST).
题解:
二叉搜索树的定义:
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根节点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉搜索树;
平衡的定义,就是指二叉树的子树高度之差不能超过1。
如果要从一个有序数组中选择一个元素作为根节点,我们应该选择中间元素作为根节点,因为这两离左右两端距离相近,高度差不会太大
选择了中间元素作为根结点后,剩下的元素分为两部分,可以看作是两个数组。剩下的元素在根结点左边的作为左子树,右边的作为右子树。
其实这就是前序遍历的步骤
代码:
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */
class Solution {
public:
/** * * @param num int整型vector * @return TreeNode类 */
TreeNode* sortedArrayToBST(vector<int>& num) {
// write code here
if(!num.size()) return NULL;
return preOrder(num,0,num.size()-1,num.size());
}
TreeNode* preOrder(vector<int>& num,int left,int right,int n){
// if(left>right) return nullptr;
if(left>right) return NULL;
int mid=(right+left+1)/2;
TreeNode* root=new TreeNode(num[mid]);
root->left=preOrder(num,left,mid-1,n);
root->right=preOrder(num,mid+1,right,n);
return root;
}
};