這題是要把一個排列好的陣列轉成一個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;
}
};
上面只是參考解法啦,反正我的概念是這樣就對了
這是個很標準利用遞迴的題目,思路學起來就對了~
這題就到這邊了~
留言列表