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;
}
};