?LeetCode刷題實戰(zhàn)427:建立四叉樹


示例


解題
N x N?的布爾值網(wǎng)絡(luò)。網(wǎng)絡(luò)中每一格的值只會是真或假。樹的根結(jié)點代表整個網(wǎng)絡(luò)。對于每個結(jié)點, 它將被分等成四個孩子結(jié)點直到這個區(qū)域內(nèi)的值都是相同的。isLeaf?和?val。isLeaf?當(dāng)這個節(jié)點是一個葉子結(jié)點時為真。val?變量儲存葉子結(jié)點所代表的區(qū)域的值。8 x 8?網(wǎng)絡(luò),我們將這樣建立一個對應(yīng)的四叉樹:

(isLeaf, val)?所代表.val?可以是任意的,所以使用*代替。
N?將小于?1000?且確保是 2 的整次冪。如果你想了解更多關(guān)于四叉樹的知識,你可以參考這個 wiki 頁面。
class?Solution?{
public:
????Node* construct(vector<vector<int>>& grid)?{
????????int?m = grid.size();
????????// cout<
????????if(m == 0){
????????????return?NULL;
????????}else?if(m == 1){
????????????if(grid[0][0] == 1){
????????????????return?new?Node(true, true, NULL, NULL, NULL, NULL);
????????????}else{
????????????????return?new?Node(false, true, NULL, NULL, NULL, NULL);
????????????}
????????}else{
????????????vector<vector<int>> lt; // left top
????????????vector<vector<int>> rt; // right top
????????????vector<vector<int>> lb; // left bottom
????????????vector<vector<int>> rb; //right bottom
????????????int?half = m/2;
????????????for(int?i = 0; i < half; i++){
????????????????lt.push_back(vector<int>(grid[i].begin(), grid[i].begin() + half));
????????????????lb.push_back(vector<int>(grid[i+half].begin(), grid[i+half].begin() + half));
????????????????rt.push_back(vector<int>(grid[i].begin()+half, grid[i].end()));
????????????????rb.push_back(vector<int>(grid[i+half].begin()+half, grid[i+half].end()));
????????????}
????????????Node* _lt = construct(lt);
????????????Node* _rt = construct(rt);
????????????Node* _lb = construct(lb);
????????????Node* _rb = construct(rb);
????????????if(_lt->isLeaf && _rt->isLeaf && _lb->isLeaf && _rb->isLeaf){
????????????????if(_lt->val && _rt->val && _lb->val && _rb->val){
????????????????????return?new?Node(true, true, NULL, NULL, NULL, NULL);
????????????????}else?if(!_lt->val && !_rt->val && !_lb->val && !_rb->val){
????????????????????return?new?Node(false, true, NULL, NULL, NULL, NULL);
????????????????}else{
????????????????????return?new?Node(false, false, _lt, _rt, _lb, _rb);
????????????????}
????????????}else{
????????????????return?new?Node(false, false, _lt, _rt, _lb, _rb);
????????????}
????????}
????}
};
LeetCode刷題實戰(zhàn)421:數(shù)組中兩個數(shù)的最大異或值
LeetCode刷題實戰(zhàn)423:從英文中重建數(shù)字
LeetCode刷題實戰(zhàn)424:替換后的最長重復(fù)字符
LeetCode刷題實戰(zhàn)426:將二叉搜索樹轉(zhuǎn)化為排序的雙向鏈表
