LeetCode之二叉树

news2024/11/25 18:27:48

发现更多计算机知识,欢迎访问Cr不是铬的个人网站

最近数据结构学到二叉树,就刷了刷力扣,写这篇文章也是辅助记忆。

103二叉树锯齿形遍历

file


要解出本道题,首先要会层次遍历。层次遍历我们都知道用一个队列去实现就行。但是力扣这里的输出时一个二维的vector,每一层的值在不同的列表里面。这里是一个难点。这个锯齿形遍历无非加一个判断本层是奇数还是偶数层,然后用内置的revers函数处理一下就可。

代码:

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> ret; // 存储结果的二维向量
        queue<TreeNode*> dq; // 辅助队列用于层序遍历
        if (root == nullptr) {
            return ret; // 如果根节点为空,直接返回空结果
        }
        dq.push(root); // 将根节点入队
        int level = 1; // 层级标志,初始为1
        while (!dq.empty()) {
            int size = dq.size(); // 当前层的节点数
            vector<int> tmp; // 临时向量存储当前层的节点值
            for (int i = 0; i < size; i++) {
                TreeNode* node = dq.front(); // 取出队首节点
                dq.pop(); // 出队
                tmp.push_back(node->val); // 将节点值存入临时向量
                if (node->left != nullptr) {
                    dq.push(node->left); // 左子节点入队
                }
                if (node->right != nullptr) {
                    dq.push(node->right); // 右子节点入队
                }
            }
            if (level % 2 == 0) {
                reverse(tmp.begin(), tmp.end()); // 如果是偶数层级,将临时向量反转
            }
            ret.push_back(tmp); // 将当前层的节点值向量存入结果向量
            level++; // 层级标志自增
        }
        return ret; // 返回结果向量
    }
};

103对称二叉树

file

判断对称二叉树可以在判断完全相同的二叉树的基础上面进行。只是递归的时候变成了left->right ,rigth->left这种.

利用递归解决代码:

class Solution {
public:
    // 判断两个节点是否镜像对称
    bool isMirror(TreeNode* left, TreeNode* right) {
        if (left == nullptr && right == nullptr) {
            return true; // 如果两个节点都为空,则它们镜像对称
        } else if (left == nullptr || right == nullptr) {
            return false; // 如果其中一个节点为空,则它们不镜像对称
        } else {
            // 判断当前节点的值相等,并且左子树的左子节点与右子树的右子节点镜像对称,
            // 左子树的右子节点与右子树的左子节点镜像对称
            return (left->val == right->val) && isMirror(left->left, right->right) && isMirror(left->right, right->left);
        }
    }

    // 判断二叉树是否对称
    bool isSymmetric(TreeNode* root) {
        if (root == nullptr) {
            return true; // 如果根节点为空,则认为是对称的
        }
        return isMirror(root->left, root->right); // 判断根节点的左子树和右子树是否镜像对称
    }
};

isMirror函数中,如果两个节点都为空,则它们镜像对称;如果其中一个节点为空,则它们不镜像对称;否则,判断当前节点的值相等,并且左子树的左子节点与右子树的右子节点镜像对称,左子树的右子节点与右子树的左子节点镜像对称

由前序遍历与中序遍历得到树

file

这是一个非常经典的问题,这里我给出一个我觉得很容易理解的代码:

class Solution {
public:
    // 通过前序遍历和中序遍历构建二叉树的递归函数
    TreeNode* build(vector<int>& preorder, int l1, int r1, vector<int>& inorder, int l2, int r2) {
        TreeNode* root = new TreeNode(preorder[l1]); // 创建当前子树的根节点
        int i = l2;
        while (inorder[i] != root->val) {
            i++; // 在中序遍历中找到根节点的位置
        }
        int Llen = i - l2; // 计算左子树的长度
        int Rlen = r2 - i; // 计算右子树的长度

        if (Llen <= 0) {
            root->left = nullptr; // 如果左子树长度小于等于0,说明左子树为空
        } else {
            // 递归构建左子树,左子树的前序遍历范围为[l1+1, l1+Llen],中序遍历范围为[l2, i-1]
            root->left = build(preorder, l1 + 1, l1 + Llen, inorder, l2, i - 1);
        }

        if (Rlen <= 0) {
            root->right = nullptr; // 如果右子树长度小于等于0,说明右子树为空
        } else {
            // 递归构建右子树,右子树的前序遍历范围为[l1+Llen+1, r1],中序遍历范围为[i+1, r2]
            root->right = build(preorder, l1 + Llen + 1, r1, inorder, i + 1, r2);
        }

        return root; // 返回当前子树的根节点
    }

    // 构建二叉树
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size(); // 前序遍历序列的长度
        int m = inorder.size(); // 中序遍历序列的长度
        TreeNode* root;
        root = build(preorder, 0, n - 1, inorder, 0, m - 1); // 调用递归函数构建二叉树
        return root; // 返回根节点
    }
};

考虑一下,如果要求的是从后序遍历和中序遍历得到树呢?上述代码该如何变化呢?

这里也贴上代码:

class Solution {
public:
    TreeNode* build(vector<int>& inorder, int l1, int r1, vector<int>& postorder, int l2, int r2)
    {
        if (l1 > r1 || l2 > r2)
            return nullptr;

        TreeNode* root = new TreeNode(postorder[r2]);
        int i = l1;
        while (inorder[i] != root->val)
            i++;

        int Llen = i - l1;
        int Rlen = r1 - i;

        root->left = build(inorder, l1, i - 1, postorder, l2, l2 + Llen - 1);
        root->right = build(inorder, i + 1, r1, postorder, l2 + Llen, r2 - 1);

        return root;
    }

    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        int n = inorder.size();
        int m = postorder.size();
        TreeNode* root;
        root = build(inorder, 0, n - 1, postorder, 0, m - 1);
        return root;
    }
};

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

【软件安装】Centos系统中安装docker容器(华为云HECS云耀服务器)

这篇文章&#xff0c;主要介绍Centos系统中安装docker容器&#xff08;华为云HECS云耀服务器&#xff09;。 目录 一、安装docker 1.1、卸载旧版本docker 1.2、更新repo镜像 1.3、安装依赖包 1.4、添加docker-ce镜像 1.5、安装docker-ce 1.6、查看docker安装版本 1.7、…

MATLAB 机械臂逆运动学进行轨迹控制建模

系列文章目录 文章目录 系列文章目录前言一、模型概览1.1 Target Pose Generation 目标姿势生成1.2 Inverse Kinematics 逆运动学1.3 Manipulator Dynamics 机械手动力学1.4 Pose Measurement 姿势测量 二、机械手定义三、生成航点四、模型设置五、模拟机械手运动六、将结果可视…

振南技术干货集:比萨斜塔要倒了,倾斜传感器快来!(2)

注解目录 1、倾斜传感器的那些基础干货 1.1 典型应用场景 &#xff08;危楼、边坡、古建筑都是对倾斜敏感的。&#xff09; 1.2 倾斜传感器的原理 1.2.1 滚珠式倾斜开关 1.2.2 加速度式倾斜传感器 1)直接输出倾角 2)加速度计算倾角 3)倾角精度的提高 &#xff08;如果…

2023年亚太杯数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

【LeetCode】每日一题 2023_11_16 最长奇偶子数组(枚举,模拟)

文章目录 刷题前唠嗑K 个元素的最大和题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode? 启动&#xff01;&#xff01;&#xff01; 今天早上概率论期中&#xff0c;被爆杀完之后&#xff0c;下午数电&#xff0c;今天很疲惫很疲惫&#xff0c;一直拖到了现在&#xff0c;终…

【论文阅读】A Survey on Video Diffusion Models

视频扩散模型&#xff08;Video Diffusion Model&#xff09;最新综述GitHub 论文汇总-A Survey on Video Diffusion Models。 paper&#xff1a;[2310.10647] A Survey on Video Diffusion Models (arxiv.org) 0. Abstract 本文介绍了AIGC时代视频扩散模型的全面回顾。简要介…

目标检测—YOLO系列(一)(YOLOv1/2/v3/4/5/x/6/7/8)

目标检测概述 什么是目标检测&#xff1f; 滑动窗口&#xff08;Sliding Window&#xff09; 滑动窗口的效率问题和改进 滑动窗口的效率问题&#xff1a;计算成本很大 改进思路 1&#xff1a;使用启发式算法替换暴力遍历 例如 R-CNN&#xff0c;Fast R-CNN 中使用 Selectiv…

docker 部署日志平台出错汇总

第一次运行elasticsearch:8.11.1镜像&#xff0c;报错如下&#xff1a; [rootmaster ~]# docker run --name es03 --net elastic -p 9200:9200 -it -m 1GB docker.elastic.co/elasticsearch/elasticsearch:8.11.1 docker: Error response from daemon: driver failed programmi…

网络编程TCP/UDP通信

1 网络通信概述 1.1 IP 和端口 所有的数据传输&#xff0c;都有三个要素 &#xff1a;源、目的、长度。 怎么表示源或者目的呢&#xff1f;请看图 所以&#xff0c;在网络传输中需要使用“IP 和端口”来表示源或目的。 1.2 网络传输中的 2 个对象&#xff1a;server 和 cl…

面向配电网韧性提升的移动储能预布局与动态调度策略(matlab代码)

欢迎关注威♥“电击小子程高兴的MATLAB小屋”获取更多资料 该程序复现《面向配电网韧性提升的移动储能预布局与动态调度策略》&#xff0c;具体摘要内容见下图&#xff0c;程序主要分为两大模块&#xff0c;第一部分是灾前预防代码&#xff0c;该部分采用两阶段优化算法&#…

YOLOv8-Seg改进策略:全新的聚焦式线性注意力模块Focused Linear Attention | ICCV2023

🚀🚀🚀本文改进:深入分析了现有线性注意力方法的缺陷,并提出了一个全新的聚焦的线性注意力模块(Focused Linear Attention),同时具有高效性和很强的模型表达能力。 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,…

写论文技巧

目录 chatgpt数学公式英文润色中英互译如何搜和下载论⽂1 搜论⽂3 下载论⽂chatgpt 数学公式 英文润色

17. Series.dt.month-提取日期数据中的月份信息

【目录】 文章目录 17. Series.dt.month-提取日期数据中的月份信息1. 知识回顾-创建一个Series对象2. 知识回顾-pd.to_datetime()将数据转换为pandas中的日期时间格式3. 实例化类相关知识4. Series.dt.month是什么&#xff1f;5. 如何使用Series.dt.month&#xff1f;6. Series…

jQuery 【关于jQuery 、 jQuery简介、基础选择器、属性选择器、jQuery扩展】(一)-全面详解(学习总结---从入门到深化)

目录 关于jQuery jQuery简介 选择器之基础选择器(一) 选择器之基础选择器(二) 选择器之属性选择器(一) 选择器之属性选择器(二) 选择器之jQuery扩展(一) 选择器之jQuery扩展(二) 关于jQuery 现在是否还需要学习jQuery&#xff0c;毫无疑问到目前为止&#xff0c;我们仍然…

【Synopsys Bug记录】Synopsys工具显示license过期

首先查找网络配置&#xff0c;打开终端&#xff0c;输入ifconfig&#xff0c;看是否有ens33 若没有ens33&#xff0c;则说明linux的网卡因为某些原因未启用&#xff0c;我们需要更改ifcfg-ens33文件&#xff1b; 输入指令 cd ./etc/sysconfig/network-scripts sudo vim ifcfg-…

关于 内部类 你了解多少?(详解!!)

目录 1. 什么是内部类&#xff1f; 2. 内部类的分类 3. 内部类 3.1 实例内部类 3.2 静态内部类 4. 局部内部类 5. 匿名内部类 6.对象的打印 “不积跬步无以至千里&#xff0c;不积小流无以成江海。”每天坚持学习&#xff0c;哪怕是一点点&#xff01;&#xff01;&a…

企业微信获取第三方应用凭证

上一篇介绍了如何配置通用开发参数及通过url回调验证&#xff0c; 本篇将通过服务商后台配置关联小程序应用配置和获取第三方凭证及如何配置企业可信IP。 当然上篇配置的回调设置也不会白费&#xff0c;在下方的指令和数据回调会用到。 第三方应用开发流程 官方企业微信第三方…

来讲解一手事务隔离级别

简介 在数据库管理系统中&#xff0c;事务是一组被视为单一工作单元的操作&#xff0c;这些操作要么全部执行成功&#xff0c;要么全部回滚。为了确保在多用户并发访问数据库时数据的一致性和可靠性&#xff0c;引入了事务隔离级别的概念。事务隔离级别定义了一个事务对于其他…

集群搭建(redis7)

一、主从复制(replica)&#xff08;不推荐&#xff09; 介绍 主从复制 mmaster以写为主&#xff0c;slave以读为主当master数据变化时&#xff0c;自动将新的数据异步同步到其他slave数据库 读写分离down机恢复数据备份水平扩容支撑高并发 基本操作 配从不配主 权限细节 maste…

CMA认证和CNAS认可的联系和区别?哪个更权威?

一、CMA认证是什么?   CMA认证是指中国计量认证&#xff0c;省级以上的计量行政部门根据中国计量法的规定&#xff0c;对申请CMA测试资质的第三方检测机构进行评估&#xff0c;对检测水平和检测可靠性达到国家标准的实验室授予计量认证合格证书(CMA资质)。 二、CNAS认可是什…