close

這題是要把一個排列好的陣列轉成一個BST

BST(Binary Search Tree)的定義就是:假設有一個節點,在他左子樹裡所有的值都比這個節點的值小,右子樹都比這個節點的值大

所以BST有一個特性就是,如果你是用DFS去尋訪的話,就會剛好排出排好序的數列

這個可以注意一下啊,通常這些題目都是要利用這些特性的

 

建出tree的第一步呢,就是找出他的root嘛,我們要如何從排好序的數列中找到root呢

嗯... 其實也不能說找出,要說選出才對

畢竟一個數列可以建成很多種不同長相的BST,我們只要建出其中一種就行了

 

想想就建個... 最平均的吧

就拿數列最中間那個當作root

而依照BST的定義呢,左子樹的值都比較小,右子樹的值都比較大

所以講道理,在陣列中root值前面的值都是屬於左子樹,右邊的值都是屬於右子樹

 

然後我們就可以... 把左邊的數值切出來,繼續考慮要拿哪個值當作root,把右邊的值切出來...依此類推到沒有值為止

 

就變成一個遞迴問題了

class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        if (nums.empty())
            return NULL;
        
        if (nums.size() == 1)
        {
            return new TreeNode(nums[0]);
        }
        
        int iMid = nums.size()/2;
        
        TreeNode* root = new TreeNode(nums[iMid]);
            
        vector<int> vleft(nums.begin(), nums.begin() + iMid);  // 左邊的數值
        vector<int> vright(nums.begin() + iMid + 1, nums.end());  // 右邊的數值
        
        root->left = sortedArrayToBST(vleft);
        root->right = sortedArrayToBST(vright);

        return root;
    }
};

 

上面只是參考解法啦,反正我的概念是這樣就對了

這是個很標準利用遞迴的題目,思路學起來就對了~

這題就到這邊了~ 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()