Convert Sorted Array(List) to Binary Search Tree

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章