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之路的主要内容,如果未能解决你的问题,请参考以下文章