LeetCode 427 建立四叉树[dfs] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 427 建立四叉树[dfs] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。




解题思路:
一道又臭又长的题目,本质上是不错的创新题,但是给中文翻译整的无语。题意为,将一个大区域划分为若干个小区域(要求每个小区域中的val全部一致),每次都是将一个大区域划分为4份(直到小区域val全部一致,终止)。

  • 按照声明中的topLeft、topRight、bottomLeft以及bottomRight将一个大区域划分为4各小区域。
  • 使用for循环校验每个小区域中val是否全部一致。
  • 如果小区域不一致,则为非叶子结点,还可以继续划分(此时val为任意bool值)。
  • 如果小区域全部一致,则isLeaf此时设置val、isLeaf=true同时四个指针全部置空nullptr。

代码如下:

/*
// Definition for a QuadTree node.
class Node 
public:
    bool val;
    bool isLeaf;
    Node* topLeft;
    Node* topRight;
    Node* bottomLeft;
    Node* bottomRight;
    
    Node() 
        val = false;
        isLeaf = false;
        topLeft = NULL;
        topRight = NULL;
        bottomLeft = NULL;
        bottomRight = NULL;
    
    
    Node(bool _val, bool _isLeaf) 
        val = _val;
        isLeaf = _isLeaf;
        topLeft = NULL;
        topRight = NULL;
        bottomLeft = NULL;
        bottomRight = NULL;
    
    
    Node(bool _val, bool _isLeaf, Node* _topLeft, Node* _topRight, Node* _bottomLeft, Node* _bottomRight) 
        val = _val;
        isLeaf = _isLeaf;
        topLeft = _topLeft;
        topRight = _topRight;
        bottomLeft = _bottomLeft;
        bottomRight = _bottomRight;
    
;
*/

class Solution 
public:
    Node* construct(vector<vector<int>>& grid) 
        if(grid.empty()) 
            return nullptr;
        
        return dfs(grid, 0, 0, grid.size());
    

    Node* dfs(vector<vector<int>>& grid, int row, int col, int N) 
        int val = grid[row][col];
        for (int i = row; i < row + N; i++) 
            for (int j = col; j < col + N; ++j) 
                // val不一致,非叶子结点,构建新节点
                if (grid[i][j] != val) 
                    Node* ret = new Node(val, false);
                    N /= 2;
                    ret->topLeft = dfs(grid, row, col, N);
                    ret->topRight = dfs(grid, row, col + N, N);
                    ret->bottomLeft = dfs(grid, row + N, col, N);
                    ret->bottomRight = dfs(grid, row + N, col + N, N);
                    return ret;
                
            
        
        // 返回新叶子节点
        return new Node(val, true);
    
;

以上是关于LeetCode 427 建立四叉树[dfs] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 0427「建立四叉树」

LeetCode 0427「建立四叉树」

LeetCode 0427「建立四叉树」

LeetCode 0427「建立四叉树」

Leetcode 558.四叉树交集

SpatialHadoop中空间索引系列之四叉树索引原理