牛客题霸 [将升序数组转化为平衡二叉搜索树]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 hereif(!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;}
};