把排序数组转化为高度最小的搜索二叉树
题目描述:
给一个排序数组(从小到大),将其转换为一棵高度最小的排序二叉树。
样例
给出数组 [1,2,3,4,5,6,7], 返回
4
/ \
2 6
/ \ / \
1 3 5 7
解题思路:
二叉搜索树是左子树的值比根结点小,根结点的值比右子树小的树(假设左右子树都存在的话)。因此利用递归以及二分的思想,把给定的排序数组找到中间值给根结点,中间值前面的给左子树,后面的给右子树,以此类推,当左子树的值比右子树大的时候,递归终止。
代码实现:
class Solution {
public:
/**
* @param A: A sorted (increasing order) array
* @return: A tree node
*/
TreeNode *sortedArrayToBST(vector<int> &A) {
// write your code here
if(A.size()==0) return NULL;
else {
return def(A,0,A.size()-1);
}
}
TreeNode* def(vector<int>&A,int left,int right){
if(left>right) return NULL;
int mid=(left+right)/2;
TreeNode *tree=new TreeNode(A[mid]);
tree->left=def(A,left,mid-1);
tree->right=def(A,mid+1,right);
return tree;
}
};
public:
/**
* @param A: A sorted (increasing order) array
* @return: A tree node
*/
TreeNode *sortedArrayToBST(vector<int> &A) {
// write your code here
if(A.size()==0) return NULL;
else {
return def(A,0,A.size()-1);
}
}
TreeNode* def(vector<int>&A,int left,int right){
if(left>right) return NULL;
int mid=(left+right)/2;
TreeNode *tree=new TreeNode(A[mid]);
tree->left=def(A,left,mid-1);
tree->right=def(A,mid+1,right);
return tree;
}
};
A题感悟:
此题的思想主要是把二分法与递归结合,再者需要注意给定排序数组的边界问题,不然很有可能溢出。