【LeetCode】427. 建立四叉树
解题思路
构建四叉树的核心是分治策略:将矩阵递归划分为四个子区域(左上、右上、左下、右下),直到子区域内所有值相同(全0或全1)或无法再划分。每个节点需根据当前区域的值一致性决定是否为叶子节点:
- 叶子节点:区域值全相同,
isLeaf=true,val=区域值,子节点为nil。 - 非叶子节点:区域值不同,
isLeaf=false,val可任意,继续递归划分四个子区域。 
关键步骤
- 
递归函数设计
- 参数:当前子矩阵的起始行
r0、起始列c0、边长n。 - 终止条件:当前子矩阵所有值相同 → 返回叶子节点。
 - 递归划分:若值不同,将矩阵分为4个子矩阵(边长
n/2),递归构建子节点。 
 - 参数:当前子矩阵的起始行
 - 
值一致性检查
- 遍历当前子矩阵,若存在不同值则返回
false,否则返回true并记录一致值。 
 - 遍历当前子矩阵,若存在不同值则返回
 - 
子区域划分
- 左上:
(r0, c0, n/2) - 右上:
(r0, c0 + n/2, n/2) - 左下:
(r0 + n/2, c0, n/2) - 右下:
(r0 + n/2, c0 + n/2, n/2) 
 - 左上:
 - 
节点创建
- 叶子节点:
isLeaf=true,val=一致值, 子节点为nil。 - 非叶子节点:
isLeaf=false,val可任意(如true),子节点为递归结果。 
 - 叶子节点:
 
代码实现
示例测试
复杂度分析
| 维度 | 结果 | 说明 | 
|---|---|---|
| 时间复杂度 | O(n² log n) | 每次递归需检查O(n²)元素(最坏情况),递归深度O(log n)(每次边长减半)。 | 
| 空间复杂度 | O(n²) | 存储所有节点(最坏有O(n²)叶子节点)。 | 
| 适用场景 | n ≤ 64 (2⁶) | 
题目约束n=2^x (0≤x≤6),递归深度最多6层。 | 
关键点总结
- 分治递归:核心是自顶向下划分区域,通过
build函数递归处理子网格。 - 终止条件:区域值全相同 → 立即返回叶子节点,避免无效划分。
 - 节点类型:
- 叶子节点:
isLeaf=true,val为区域值,子节点为nil。 - 非叶子节点:
isLeaf=false,val可任意(按题目要求设true),子节点必不为nil。 
 - 叶子节点:
 - 坐标计算:子区域划分需精确计算中间行列(
r0 + size/2,c0 + size/2)。 - 优化方向:
- 值检查优化:若首元素与后续不同可提前终止遍历。
 - 大矩阵处理:并行构建四个子节点(Go的
goroutine+sync.WaitGroup)。 
 
                    
                
                
            
        
浙公网安备 33010602011771号