###### tags: `Leetcode` `easy` `tree` `divide and conquer` `python` `c++`
# 108. Convert Sorted Array to Binary Search Tree
## [題目出處:] https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/
## 題目:
Given an integer array nums where the elements are sorted in **ascending order**, convert it to a **height-balanced** binary search tree.
A **height-balanced** binary tree is a binary tree in which the depth of the two subtrees of every node never differs by more than one.
## 解題想法:
因為題目給的是已經排好的數組
由最中間的數字當作root,遞迴即可
## Python:
``` python=
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def insertLeft(self,node):
if self.left==None:
self.left=TreeNode(node)
else:
self.left.insertLeft(node)
def insertRight(self,node):
if self.right==None:
self.right=TreeNode(node)
else:
self.right.insertRight(node)
def printTree(self):
root=self
stack=[root]
res=[]
while stack:
root=stack.pop(0)
res.append(root.val)
if root.left:
stack.append(root.left)
if root.right:
stack.append(root.right)
print(res)
class Solution(object):
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
if not nums:
return None
mid=len(nums)//2
root=TreeNode(nums[mid])
root.left=self.sortedArrayToBST(nums[:mid])
root.right=self.sortedArrayToBST(nums[mid+1:])
return root
nums=[-10,-3,0,5,9]
result=Solution()
ans=result.sortedArrayToBST(nums)
ans.printTree()
```
## C++:
``` cpp:
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(): val(0), left(nullptr), right(nullptr) {}
TreeNode(int x): val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode* left, TreeNode* right): val(x), left(left), right(right) {}
};
void InsertLeft(TreeNode* root, int data){
TreeNode *tmp=root;
if (tmp->left != nullptr)
InsertLeft(root->left, data);
else{
TreeNode *new_left= new TreeNode(data);
tmp->left=new_left;
}
}
void InsertRight(TreeNode*root, int data){
TreeNode *tmp=root;
if (tmp->right != nullptr)
InsertRight(root->right, data);
else{
TreeNode *new_right= new TreeNode(data);
tmp->right=new_right;
}
}
void PrintTree(TreeNode* root){
TreeNode *tmp=root;
vector<int> res;
queue<TreeNode*> que;
que.push(root);
while (!que.empty()){
TreeNode *curRoot=que.front(); que.pop();
res.push_back(curRoot->val);
if (curRoot->left)
que.push(curRoot->left);
if (curRoot->right)
que.push(curRoot->right);
}
for (int i=0; i<res.size(); i++){
cout<<res[i]<<" ";
}
cout<<endl;
}
class Solution{
public:
TreeNode* sortedArrayToBST(vector<int>& nums){
if (nums.empty())
return nullptr;
int mid = nums.size()/2;
TreeNode *root=new TreeNode(nums[mid]);
vector<int> left(nums.begin(), nums.begin()+mid); //nums[:mid]
vector<int> right(nums.begin()+mid+1, nums.end()); //nums[mid+1:]
root->left=sortedArrayToBST(left);
root->right=sortedArrayToBST(right);
return root;
}
};
int main(){
Solution res;
vector<int> nums={-10,-3,0,5,9};
TreeNode *ans=res.sortedArrayToBST(nums);
PrintTree(ans);
return 0;
}
```