LeetCode之二叉树

发现更多计算机知识,欢迎访问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.mfbz.cn/a/154693.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重磅 | 进一步夯实生态建设,朗思科技与阿里龙蜥完成兼容性认证

近日&#xff0c;北京朗思智能科技有限公司&#xff08;以下简称“朗思科技”&#xff09;自主研发的数字员工产品与OpenAnolis龙蜥社区龙蜥操作系统&#xff08;Anolis OS&#xff09;8完成兼容性认证。测试结果显示&#xff0c;双方产品相互兼容&#xff0c;功能正常&#xf…

【window 10】开启加速器,连接外网 打开外网链接

打开网页 链接 https://steampp.net/&#xff0c;点击下载 下载 我选的是 微软商店 安装 打开后界面是这样&#xff0c;先注册个用户登录 选择 需要加速的内容 先选中下面的复选框 再点击 ‘一键加速’ 按钮&#xff0c;出现下面的界面 打开外网的链接 直接访问 就好了&#xf…

【算法每日一练]-图论(保姆级教程 篇3(遍历))#图的遍历 #奶牛牧场 #杂务

今天讲图的遍历 目录 题目:图的遍历 思路&#xff1a; 题目&#xff1a;奶牛牧场 思路&#xff1a; 题目&#xff1a;杂务 思路&#xff1a; 题目:图的遍历 思路&#xff1a; 正向建边需要跑O(N^2)会超时&#xff0c;所以反向建边&#xff0c;先从最大的点出发&#x…

解锁编程潜能:探索亚马逊CodeWhisperer,打造编程世界的声音引导者

文章目录 前言一、什么是 Amazon CodeWhisperer&#xff1f;二、如何使用CodeWhisperer&#xff1f;安装CodeWhisperer插件配置CodeWhisperer生成注释和文档 总结 前言 随着CHATGPT的一声巨响&#xff0c;大语言模型已经成为了一个备受瞩目的创新应用。亚马逊云科技作为全球领…

Java常用命令行指令有哪些?Java指令分享!

在Java开发中&#xff0c;命令行工具是非常重要的&#xff0c;它们允许开发人员执行各种任务&#xff0c;从编译和运行Java程序到管理Java虚拟机。本文将介绍一些常用的Java命令行指令&#xff0c;并通过具体实例演示它们的用法。 1. 编译Java源代码 使用javac命令可以将Java源…

贪吃蛇基础知识铺垫2(c语言)

宽字符的打印 那如果想在屏幕上打印宽字符&#xff0c;怎么打印呢&#xff1f; 宽字符的字⾯量必须加上前缀“L”&#xff0c;否则 C 语⾔会把字⾯量当作窄字符类型处理。前缀“L”在单引 号前⾯&#xff0c;表⽰宽字符&#xff0c;对应 wprintf() 的占位符为 %lc &#xff1b…

[Linux]NFS文件共享服务

一、NFS 1.1 NFS的简介 NFS&#xff08;Network File System 网络文件服务&#xff09;&#xff0c;是一种基于 TCP/IP 传输的网络文件系统协议&#xff0c;最初由 Sun 公司开发。 NFS 服务的实现依赖于 RPC&#xff08;Remote Process Call&#xff0c;远端过程调用&#x…

Hacker 资讯|11 月中下旬区块链黑客松活动汇总

「TinTin Hacker 快讯」是 TinTinLand 建立的一个资讯专栏&#xff0c;汇集近期线上线下的黑客松及 Grant&#xff0c;旨在帮助开发者和区块链爱好者获取最新的黑客松资讯&#xff0c;鼓励他们了解并根据自身情况参与不同的黑客松&#xff0c;更好地建设 Web3 生态。 2023 Wint…

被保留的IP地址:潜在用途和管理策略

在互联网的底层&#xff0c;存在一些特定范围的IP地址被保留&#xff0c;不分配给特定的设备或组织。这些被保留的IP地址有着特殊的用途&#xff0c;涉及网络通信、安全性和私有网络等方面。本文将深入探讨被保留的IP地址的潜在用途以及管理策略。 1. 被保留的IP地址范围 被保留…

【算法基础】分解质因数

文章目录 什么是分解质因数具体案例输入格式输出格式数据范围 原理讲解原始方法转换思路利用试除法判定质数的思路为什么不需要单独判断是否为质数 什么是分解质因数 分解质因数是指将一个合数用质因数相乘的形式表示出来&#xff0c;即将一个合数分解为若干个质数的乘积。其中…

接口自动化测试如何实现?5个步骤轻松拿捏!

最近接到一个接口自动化测试的case&#xff0c;并展开了一些调研工作&#xff0c;最后发现&#xff0c;使用pytest测试框架并以数据驱动的方式执行测试用例&#xff0c;可以很好的实现自动化测试。这种方式最大的优点在于后续进行用例维护的时候对已有的测试脚本影响很小。当然…

python+requests接口自动化完整项目设计源码

前言 有很多小伙伴吵着要完整的项目源码&#xff0c;完整的项目属于公司内部的代码&#xff0c;这个是没法分享的&#xff0c;违反职业道德了&#xff0c;就算别人分享了&#xff0c;也只适用于本公司内部的业务。 所以用例的代码还是得自己去一个个写&#xff0c;我只能分享…

4.4.2.1 内部类

内部类 成员内部类 定义 调用内部类 访问修饰符的影响 外部类的成员变量及成员方法在内部类的使用 内部类在外部类的使用 静态内部类 静态内部类调用非静态外部类 1

乡村电商人才齐聚浙江建德,这场农播氛围值已拉满!

“3、2、1&#xff0c;上链接!” “现场营造了很好的交流氛围&#xff0c;碰撞出了不少合作机会。” “农播让我们有机会为家乡农产品代言&#xff0c;并且通过电商平台&#xff0c;把优质农特产品卖到全国各地。” “就像是一个演员需要一个舞台&#xff0c;一个好产品也需…

企业邮箱认证指南:安全与高效的邮箱认证方法

企业邮箱是专门为企业提供的电子邮件服务&#xff0c;安全性和专业性更高。在开始使用企业邮箱之前&#xff0c;很多人会有一些问题&#xff0c;比如企业邮箱需要认证吗、如何开通企业邮箱&#xff0c;以及哪款企业邮箱好。 1、企业邮箱在使用前需要认证吗&#xff1f; 答案是肯…

数据结构(c语言版本) 二叉树的遍历

要求 实现二叉树的创建&#xff0c;并输入二叉树数据 然后先序遍历输出二叉树、中序遍历输出二叉树、后序输出二叉树 例如二叉树为&#xff1a; 该二叉树的先序遍历结果为&#xff1a; A B D C E F 该二叉树的中序遍历结果为&#xff1a; B D A E C F 该二叉树的后序遍历结果…

互联网上门预约洗衣洗鞋店小程序;

拽牛科技干洗店洗鞋店软件&#xff0c;方便快捷&#xff0c;让你轻松洗衣。只需在线预约洗衣洗鞋服务&#xff0c;附近的门店立即上门取送&#xff0c;省心省力。轻松了解品牌线下门店&#xff0c;通过列表形式展示周围门店信息&#xff0c;自动选择最近门店为你服务。简单填写…

分布式下多节点WebSocket消息收发

1、使用场景 2、疑问 第一次发送请求后&#xff0c;通过N1&#xff0c;W2&#xff0c;到达service2&#xff0c;建立websocket连接。 1、接下来发送的消息&#xff0c;通过Ngixn后和网关gateway后还能落在service2上面吗&#xff1f; 如果不能落在service2上&#xff0c;需要怎…

【C语法学习】25 - strncpy()函数

文章目录 1 函数原型2 参数3 返回值4 使用说明5 示例5.1 示例15.2 示例2 1 函数原型 strncpy()&#xff1a;将str指向的字符串的前n个字符拷贝至dest&#xff0c;函数原型如下&#xff1a; char *strncpy(char *dest, const char *src, size_t n);2 参数 strncpy()函数有三个…

【服务端性能测试】性能测试指标!

接触过性能测试的小伙伴一定都听过响应时间&#xff08;Response Time&#xff09;、TPS、CPU资源利用率等术语&#xff0c;它们都属于性能测试的指标。本文对性能测试中涉及到的指标做了较为详细的整理。 性能测试指标一般可以分为系统性能指标、资源指标、应用指标&#xff…