108. 将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return BST(nums,0,nums.size() - 1);
}
TreeNode* BST(vector<int>& nums, int left, int right){
if(left > right)
return nullptr;
int mid = (left + right)/2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = BST(nums,left, mid - 1);
root->right = BST(nums,mid + 1,right);
return root;
}
};
解答:把一个有序的序列转化为一棵二叉搜索树并且是平衡的,就要考虑到平衡树的特点。
平衡二叉树特点:
(1)非叶子节点最多拥有两个子节点;
(2)非叶子节值大于左边子节点、小于右边子节点;
(3)树的左右两边的层级数相差不会大于1;
(4)没有值相等重复的节点;
主要满足于第三条,又有序给的序列是递增的那么就每次把要转化的序列的中间节点作为根节点,然后再递归的转化子树。这样的话左右的节点个数是一样的,因此可以递归的构造平衡二叉树。