Convert Sorted Array to Binary Search Tree
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
题意:用一个升序数组生成一棵二叉平衡树。分析:每次选中间的元素mid生成节点,mid左边的递归生成左子树,mid右侧的递归生成右子树。思路比较清晰。
代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *sortedArrayToBST(vector<int> &num) {
if(num.size()<1) return NULL;
return gen(num,0,num.size()-1);
}
TreeNode *gen(vector<int> &num, int l, int r){//这里是[l,r]均包含
if(l>r) return NULL;
int mid=l+(r-l)/2;
TreeNode *root= new TreeNode(num[mid]);
root->left=gen(num,l,mid-1);//每次剔除一个元素
root->right=gen(num,mid+1,r);
return root;
}
};
Convert Sorted List to Binary Search Tree
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
题意:将一个升序链表,转为二叉平衡树。分析:思路同上,只不过在获得中间元素时,时间复杂度为O(N),利用slow fast指针,当fast指到末尾时,slow指向中间。牵扯到链表,写代码要小心。。。注意这里是左闭右开区间,应为链表单向,找不到mid->pre。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode *sortedListToBST(ListNode *head) {
if(head==NULL) return NULL;
return gen(head,NULL); //[l,r),注意链表查找时不包含 r
}
TreeNode *gen(ListNode *l, ListNode *r){
if(l==r){
return NULL;
}
ListNode * mid = getmid(l,r);//找到链表中间
TreeNode *root;
root= new TreeNode(mid->val);
root->left=gen(l,mid);
root->right=gen(mid->next,r);
return root;//注意要返回
}
ListNode *getmid(ListNode *l, ListNode *r){
if(l==r) return NULL;
ListNode *slow=l;
ListNode *f=l;
while(f!=r && f->next!=r){
//注意判断条件,先f,后f->next,f可能为NULL
slow=slow->next;
f=f->next->next;
}
return slow;
}
};