leetcode刷题记录28-427. 建立四叉树

news2024/12/23 17:47:12

问题描述

给你一个 n * n 矩阵 grid ,矩阵由若干 0 和 1 组成。请你用四叉树表示该矩阵 grid 。

你需要返回能表示矩阵 grid 的 四叉树 的根结点。

四叉树数据结构中,每个内部节点只有四个子节点。此外,每个节点都有两个属性:

  • val:储存叶子结点所代表的区域的值。1 对应 True,0 对应 False。注意,当 isLeaf 为 False 时,你可以把 True 或者 False 赋值给节点,两种值都会被判题机制 接受 。
  • isLeaf: 当这个节点是一个叶子结点时为 True,如果它有 4 个子节点则为 False 。
class Node {
    public boolean val;
    public boolean isLeaf;
    public Node topLeft;
    public Node topRight;
    public Node bottomLeft;
    public Node bottomRight;
}

我们可以按以下步骤为二维区域构建四叉树:

  1. 如果当前网格的值相同(即,全为 0 或者全为 1),将 isLeaf 设为 True ,将 val 设为网格相应的值,并将四个子节点都设为 Null 然后停止。
  2. 如果当前网格的值不同,将 isLeaf 设为 False, 将 val 设为任意值,然后如下图所示,将当前网格划分为四个子网格。
  3. 使用适当的子网格递归每个子节点。

示例

示例 1:

输入:grid = [[0,1],[1,0]]
输出:[[0,1],[1,0],[1,1],[1,1],[1,0]]
解释:此示例的解释如下:
请注意,在下面四叉树的图示中,0 表示 false,1 表示 True 。

示例 2:

输入:grid = [[1,1,1,1,0,0,0,0],[1,1,1,1,0,0,0,0],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,0,0,0,0],[1,1,1,1,0,0,0,0],[1,1,1,1,0,0,0,0],[1,1,1,1,0,0,0,0]]
输出:[[0,1],[1,1],[0,1],[1,1],[1,0],null,null,null,null,[1,0],[1,0],[1,1],[1,1]]
解释:网格中的所有值都不相同。我们将网格划分为四个子网格。
topLeft,bottomLeft 和 bottomRight 均具有相同的值。
topRight 具有不同的值,因此我们将其再分为 4 个子网格,这样每个子网格都具有相同的值。
解释如下图所示:

提示:

  1. n == grid.length == grid[i].length
  2. n == 2^x 其中 0 <= x <= 6

问题分析:

读题读了一千年。。。其实就是让我们根据一个矩阵来建立一个所谓的“四叉树”,这个四叉树有六个数据成员,分别是val(对应网格的一个值,如果四个方向的都是一个数就是该数值,如果有不同的话则随意,这里我用了1);isLeaf,指得是四个方向是否都是一个数,都是一个数的话这个节点就不需要再细分了;还有四个方向的Node节点(体现四叉树)。事实上这需要我们遍历四个小方格,再对小方格里面的元素进行检查,看看是不是一个元素,如果不是就继续递归分小方格。

代码如下:

/*
// 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) {
        Node* root = dfs(grid, 0, 0, grid.size(), grid.size());
        return root;
    }

    // 核心遍历部分
    Node* dfs(vector<vector<int>>& grid, int r0, int c0, int r1, int c1) {
        bool is_Leaf = true;
        int num = grid[r0][c0];
        // 遍历这个方格
        for (int i = r0; i < r1; ++i) {
            for (int j = c0; j < c1; ++j) {
                if (i == r0 && j == c0)
                    continue;
                // 如果发现有不同元素,可以进一步划分
                if (grid[i][j] != num) {
                    Node* root = new Node(grid[i][j], false);
                    root->topLeft =
                        dfs(grid, r0, c0, (r0 + r1) / 2, (c0 + c1) / 2);
                    root->topRight =
                        dfs(grid, r0, (c0 + c1) / 2, (r0 + r1) / 2, c1);
                    root->bottomLeft =
                        dfs(grid, (r0 + r1) / 2, c0, r1, (c0 + c1) / 2);
                    root->bottomRight =
                        dfs(grid, (r0 + r1) / 2, (c0 + c1) / 2, r1, c1);
                    return root;
                }
            }
        }
        // 注意new节点的时机,如果每次dfs开头都new会导致爆内存,只有不同元素和最后再new就不会
        Node* root = new Node(num, is_Leaf);
        return root;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1717646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM学习-字节码指令集(三)

代码下载 操作数栈管理指令 如同操作一个普通数据结构中的堆栈那样&#xff0c;JVM提供的操作数栈管理指令&#xff0c;可以用于直接操作数栈的指令 将一个或两个元素从栈顶弹出&#xff0c;并且直接废弃&#xff1a;pop,pop2复制栈顶一个或两个数值并将复制值成双份的复制值…

【全开源】餐饮点餐系统源码(ThinkPHP+FastAdmin+UniApp)

开启智能餐饮新时代的钥匙 基于ThinkPHPFastAdminUniApp开发的餐饮点餐系统&#xff0c;主要应用于餐饮&#xff0c;例如早餐、面馆、快餐、零食小吃等快捷扫码点餐需求&#xff0c;标准版本仅支持先付款后就餐模式&#xff0c;高级版本支持先付后就餐和先就餐后付费两种模式。…

昆虫记思维导图,超详细解读

《昆虫记》是法国杰出昆虫学家、文学家法布尔的传世佳作&#xff0c;它不仅是一部研究昆虫的科学巨著&#xff0c;同时也是一部脍炙人口的文学经典。在这部作品中&#xff0c;法布尔以其独特的视角和细腻的笔触&#xff0c;为我们揭示了一个神秘而精彩的昆虫世界。那么&#xf…

重生之 SpringBoot3 入门保姆级学习(11、日志的进阶使用)

重生之 SpringBoot3 入门保姆级学习&#xff08;11、日志的进阶使用&#xff09; 3.2.4 文件输出3.2.5 日志文档的归档与切割 3.2.4 文件输出 配置 application.properties # 日志文件名 如果不写路径默认就是在项目根路径建立 demo.log 文件 推荐写法 D:\\demo.log 路径 文…

为什么要使用动态代理IP?

一、什么是动态代理IP&#xff1f; 动态代理IP是指利用代理服务器来转发网络请求&#xff0c;并通过不断更新IP地址来保护访问者的原始IP&#xff0c;从而达到匿名访问、保护隐私和提高访问安全性的目的。动态代理IP在多个领域中都有广泛的应用&#xff0c;能够帮助用户…

面试题:计算机网络中的七四五是什么?

面试题&#xff1a;计算机网络中的七四五是什么&#xff1f; 计算机网络中说的七四五是指&#xff1a;OSI 七层模型、TCP/IP 四层模型、OSI 与 TCP/IP 的综合五层模型 OSI 七层模型 OSI 将计算机网络分为了七层&#xff0c;每一层抽象底层的内容&#xff0c;并遵守一定的规则…

【错题集-编程题】过桥(BFS)

牛客对应题目链接&#xff1a;过桥 (nowcoder.com) 一、分析题目 类似层序遍历的思想。 二、代码 //值得学习的代码 #include <iostream>using namespace std;const int N 2010;int n; int arr[N];int bfs() {int left 1, right 1;int ret 0;while(left < right)…

PMP认证与NPDP认证哪个含金量高?

PMP和NPDP&#xff0c;哪个含金量更高呢&#xff1f; PMP可以全面提升你的职业发展&#xff0c;无论你是技术人员还是项目管理人员&#xff0c;都能帮助你打破思维定式&#xff0c;拓宽视野&#xff0c;并提升管理水平和领导能力。 NPDP不仅帮助个人了解新产品开发流程和原理…

分布式锁的原理和实现(Go)

文章目录 思维导图为什么需要分布式锁&#xff1f;go语言分布式锁的实现Redis自己的实现单元测试 红锁是什么别人的带红锁的实现 etcdzk的实现 面试问题什么是分布式锁&#xff1f;你用过分布式锁吗&#xff1f;你使用的分布式锁性能如何&#xff0c;可以优化吗&#xff1f;怎么…

为什么说OV SSL比DV SSL好

OV SSL证书和DV SSL证书是两种常见的SSL证书类型&#xff0c;它们在验证深度、安全性和可见性等方面存在差异。下面是具体分析&#xff1a; 验证深度 DV SSL&#xff1a;只进行域名所有权的验证。 OV SSL&#xff1a;除了验证域名所有权&#xff0c;还需要验证企业信息。 安…

2024年人文发展与社会科学国际会议(ICHDSS 2024)

2024年人文发展与社会科学国际会议 2024 International Conference on Humanities Development and Social Sciences 【1】会议简介 2024年人文发展与社会科学国际会议是一个汇集全球人文科学和社会科学领域专家学者的盛会。本次会议旨在深入探讨人文发展的多元性、复杂性以及社…

流媒体服务器SMS-语音对讲(一)

1.简介 在国标语音对讲对接中&#xff0c;会发现不同的厂商或不同型号的设备&#xff0c;对讲流程都不一样&#xff0c;本文主要介绍流媒体与设备之间的交互情况。 SMS流媒体服务代码库地址&#xff1a;https://gitee.com/inyeme/simple-media-server 2.流媒体与设备交互的可能…

【运维项目经历|025】企业高效邮件系统部署与运维项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 问题1&#xff1a;项目周期为多长时间&#xff1f; 问题2&#xff1a;服务器部署架构方式及数量…

【EI会议|稳定检索】2024年计算机科学与信号处理国际会议(CSSP 2024)

2024年计算机科学与信号处理国际会议&#xff08;CSSP 2024&#xff09; International Conference on Computer Science and Signal Processing in 2024 【大会信息】 大会地点&#xff1a;深圳 大会官网&#xff1a;http://www.iaccssp.com 投稿邮箱&#xff1a;iaccsspsub-…

丢失的数字 ---- 位运算

题目链接 题目: 分析: 解法一: 哈希表解法二: 高斯求和解法三:位运算 异或运算根据运算的性质, 相同的两个a异或 0 以示例一为例: 数组中有0,1,3, 缺失的数字是2, 那么只要我们将数组与0,1,2,3 异或, 就会得到2 代码: class Solution {public int missingNumber(int[] num…

CS的下载+内网穿透

CS的下载 纵向渗透&#xff1a;NC 瑞士军刀菜刀是一个hyyp协议 NC是TCP NC连接后没有任何回显 先受控房 nc.exe -l -p 12345 然后攻击方 nc.exe ip port 12345 扫描端口 上传和 nc.exe 同一目录下的文件 跳板机工具和NC的实际操作以及Termite联合管理 和nc是一样的…

ArcGIS教程(04):查找最近的消防站

本节目标 创建、设置和求解最近设施点分析。在本练习中&#xff0c;将查找可对给定地址处发生的火灾做出最快响应的四个消防站。还将生成消防队员的行进路线和驾车方向。 准备视图 双击打开【Exercise04.mxd】启用 【ArcGIS Network Analyst 扩展模块】单击【自定义 > 工…

DVWA靶场搭建:Apache、MySQL、PHP、DVWA

最近为了能够较为真实地学习Web渗透的各种技术&#xff0c;就想着自己搭建一个专门用于学习的Web演练平台--DVWA“靶场”。 DVWA可以进行暴力&#xff08;破解&#xff09;、命令行注入、跨站请求伪造、文件包含、文件上传、不安全的验证码、SQL注入、SQL盲注、弱会话ID、XSS漏…

解决docker容器: bash: ping: command not found, 并制作镜像

一. 出现原因 从 dockerhub 拉下来的镜像都是最轻量级的, 不会安装各种工具, 所以使用 ping, vim 等命令, 会出现 command not found 二. 解决方式 2.1 安装工具包 进入到一个正在运行的容器内部, 执行命令: apt-get update 之后会发现, 容器正在更新软件包, 不过最终会由…

(1+X)Java程序设计高级(一)

Throwable&#xff1a;异常的基类&#xff0c;所有异常都继承自 java.lang.Throwable 类&#xff0c;Throwable 类有两个直接子类&#xff1a;Error 类和 Exception 类。Error&#xff1a;是 Java 应用程序本身无法恢复的严重错误&#xff0c;应用程序不需要捕获、处理这些严重…