LeetCode 刷题 -- Day 7

今日题目

题目难度备注
226. 翻转二叉树 简单
101. 对称二叉树简单
222. 完全二叉树的节点个数 简单⭐⭐⭐
110. 平衡二叉树 简单⭐⭐⭐
257. 二叉树的所有路径简单代码优化能力

树篇 Ⅱ

  • 今日题目
  • 题目:226. 翻转二叉树
    • 一、源代码
    • 二、代码思路
  • 题目:101. 对称二叉树
    • 一、源代码
    • 二、代码思路
    • 三、优化代码
  • 题目:222. 完全二叉树的节点个数
    • 一、源代码
    • 二、代码思路
    • 三、优化思路
    • 四、优化代码
  • 题目:110. 平衡二叉树
    • 一、源代码
    • 二、代码思路
    • 三、优化思路
    • 四、优化代码
  • 题目:257. 二叉树的所有路径
    • 一、源代码
    • 二、代码思路
    • 三、优化思路
    • 四、优化代码

题目:226. 翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode)

一、源代码

class Solution {
private:
    void DFS(TreeNode* root) {
        if (!root) return;                         // 为空指针结束
        if (root->left || root->right) {           // 左孩子或者右孩子不为空则交换左右孩子
            swap(root->left,root->right);
        }
        DFS(root->left);
        DFS(root->right);
    }
public:
    TreeNode* invertTree(TreeNode* root) {
        DFS(root);
        return root;
    }
};

二、代码思路

​ 先序遍历二叉树,若访问到空指针则结束,若访问结点的左孩子或者右孩子不为空则交换左右孩子。


题目:101. 对称二叉树

101. 对称二叉树 - 力扣(LeetCode)

一、源代码

class Solution {
private:
    bool isSym(TreeNode* root1, TreeNode* root2) {
        if (!root1 && !root2) return true;
        if ((root1 && !root2) || (!root1 && root2)) return false;
        if (root1->val != root2->val) return false;
        bool l = isSym(root1->left,root2->right);       // 判断root1 和 root2 的孩子结点对称否
        bool r = isSym(root1->right,root2->left);
        if (!l || !r) return false;
        return true;
    }
public:
    bool isSymmetric(TreeNode* root) {
        return isSym(root->left,root->right);
    }
};

二、代码思路

递归判断,每次处理一层。对每一层:

① 如果root1 和 root2 都为空,则对称。

② 如果 root1 和 root2 一个为空,一个不为空,则不对称。

③ 如果 root1 和 root2 的孩子结点不对称,则不对称。

三、优化代码

    bool isSym(TreeNode* root1, TreeNode* root2) {
        if (!root1 && !root2) return true;
        if (!root1 || !root2) return false;
        return root1->val == root2->val && isSym(root1->left,root2->right) 
               && isSym(root1->right,root2->left);
    }

题目:222. 完全二叉树的节点个数

222. 完全二叉树的节点个数 - 力扣(LeetCode)

一、源代码

class Solution {
private:
    int BFS(TreeNode* root) {
        if (!root) return 0;
        queue<TreeNode*> q;
        q.push(root);
        int cnt = 0;
        while(!q.empty()) {
            TreeNode* now = q.front();
            q.pop();
            ++cnt;
            if (now->left)  q.push(now->left);
            if (now->right) q.push(now->right);
        }
        return cnt;
    }
public:
    int countNodes(TreeNode* root) {
        return BFS(root);
    }
};

二、代码思路

​ BFS 遍历树,记录结点数

三、优化思路

​ 因为为完全二叉树,所以最多只有一个非满二叉子树,其余都是满二叉子树。所以只需判断当前节点引导的子树是不是满二叉树,是的话直接返回子树的结点,不是的话就往下遍历。此时间复杂度为 O(logn ^ 2)

四、优化代码

class Solution {
public:
    int countNodes(TreeNode* root) {
        if (!root) return 0;
        int lDepth = 0;
        int rDepth = 0;
        TreeNode* node = root;
        while (node->left) {           // 获取左子树高度
            lDepth += 1;
            node = node->left;
        }
        node = root;
        while (node->right) {          // 获取右子树高度 
            rDepth += 1; 
            node = node->right;
        }
        if (lDepth == rDepth) {        // 如果左子树高度等于右子树高度 说明为满二叉树,则直接返回 结点数
            return (int)pow(2, lDepth + 1) - 1;
        }else {                        // 否则返回左子树结点 + 右子树结点 + 1
            return countNodes(root->left) + countNodes(root->right) + 1;    
        }
    }
};

题目:110. 平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)

一、源代码

class Solution {
    int getHight(TreeNode* root,int h) {
        if (!root) return h;
        int l = getHight(root->left,h+1);
        int r = getHight(root->right,h+1);
        return l > r ? l : r;
    }
public:
    bool isBal = true;
    bool isBalanced(TreeNode* root) {
        if (!root) return true;
        if (abs(getHight(root->left, 0) - getHight(root->right, 0)) > 1) isBal = false;
        isBalanced(root->left);
        isBalanced(root->right);
        return isBal;
    }
};

// 可优化写成
    int getHight(TreeNode* root) {
        if (!root) return 0;
        return max(getHight(root->left), getHight(root->right)) + 1;
    }
     bool isBalanced(TreeNode* root) {
        if (!root) return true;
        else return abs(getHight(root->left) - getHight(root->right)) <= 1)
                    && isBalanced(root->left) &&  isBalanced(root->right);
    }

二、代码思路

​ 自顶向下遍历树的各结点(先序遍历),对每一结点,判断左右子树的高度差是否小于等于 1

三、优化思路

​ 自顶向下递归,因此对于同一个节点,函数 getHight 会被重复调用,导致时间复杂度较高。如果使用自底向上的做法(后序遍历),则对于每个节点,函数 getHight只会被调用一次。

先序遍历不管怎么样都会计算一遍再说,后序遍历可以口口相传及时止损

四、优化代码

class Solution {
public:
    int height(TreeNode* root) {          // 通过返回的高度判断是否为平衡二叉树,若为则返回高度,否则返回-1
        if (root == NULL) {
            return 0;
        }
        int leftHeight = height(root->left);         // 后序遍历
        int rightHeight = height(root->right);
        if (leftHeight == -1 || rightHeight == -1 || abs(leftHeight - rightHeight) > 1) {
            return -1;         // 左子树或右子树非平衡二叉树,或者该结点引导的二叉树非平衡,则返回 -1;
        } else {
            return max(leftHeight, rightHeight) + 1;       // 否则返回 当前结点高度
        }
    }

    bool isBalanced(TreeNode* root) {
        return height(root) >= 0;
    }
};

题目:257. 二叉树的所有路径

257. 二叉树的所有路径 - 力扣(LeetCode)

一、源代码

class Solution {
private:
    vector<vector<int>> ans;
    void DFS(TreeNode* root,vector<int> vi) {          // 遍历树,并记录各从根节点到叶子节点的路径上的结点
        if (!root) return;
        vi.push_back(root->val);
        if (!root->left && !root->right) {
            ans.push_back(vi);
        }
        if (root->left)   DFS(root->left, vi);
        if (root->right)  DFS(root->right, vi);
    }
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> vi;
        vector<string> res;
        DFS(root,vi);
        for (int i = 0; i < ans.size(); i++) {       // 获取路径,并存入 vector<string>  中
            string rode = "";
            for (int j = 0; j < ans[i].size(); j++) {
                rode += to_string(ans[i][j]);
                if (j < ans[i].size() - 1) {
                    rode += "->";
                }
            }
            res.push_back(rode);
        }
        return res;
    }
};

二、代码思路

​ 利用 DFS 遍历树,并记录各从根节点到叶子节点的路径上的结点。然后访问结点获取路径,并存入 vector<string> 中。

三、优化思路

​ 先是vector<vector<int>> ans 数组存各路径的结点,然后遍历ans 数组取出各结点形成路径,这太麻烦了。为什么不直接形成路径,然后存起来呢?这就不用定义vector<vector<int>> ans 数组了。时间复杂度和空间复杂度都会得到减少。

四、优化代码

class Solution {
public:
    void construct_paths(TreeNode* root, string path, vector<string>& paths) {
        if (root != nullptr) {
            path += to_string(root->val);
            if (root->left == nullptr && root->right == nullptr) {  // 当前节点是叶子节点
                paths.push_back(path);                              // 把路径加入到答案中
            } else {
                path += "->";  // 当前节点不是叶子节点,继续递归遍历
                construct_paths(root->left, path, paths);
                construct_paths(root->right, path, paths);
            }
        }
    }

    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> paths;
        construct_paths(root, "", paths);
        return paths;
    }
};

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

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

相关文章

RepeatMasker 基因组重复区域文件

rmsk.txt 一般关注标红的几列, 各列含义: Schema for RepeatMasker - Repeating Elements by RepeatMasker "rmsk.txt" 是 UCSC Genome Browser 提供的一个文件,用于描述重复序列的注释信息。通常,它包含了以下列: 1. **bin**:UCSC Genome Browser 使用的染色…

笔记:编写程序,绘制一个展示 2013~2019 财年阿里巴 巴淘宝+天猫平台的 GMV 的柱形图,实现过程如下:

文章目录 前言一、GMV 的柱形图是什么&#xff1f;二、编写代码总结 前言 编写程序。根据实例 2 的要求&#xff0c;绘制一个展示 2013~2019 财年阿里巴 巴淘宝天猫平台的 GMV 的柱形图&#xff0c;实现过程如下&#xff1a; &#xff08;1&#xff09; 导入 matplotlib.pypl…

2024中国(江西)国际先进陶瓷材料及智能装备博览会

2024中国&#xff08;江西&#xff09;国际先进陶瓷材料及智能装备博览会 “中国&#xff08;江西&#xff09;国际先进陶瓷材料及智能装备博览会” 陶瓷三新展 &#xff08;新材料、新装备、新技术&#xff09; 绿色智能、引领未来 2024年11月1日-11月3日 中国江西 南昌…

生活服务推出品牌实惠团购,覆盖五一假期“吃喝玩乐”多场景

4月26日&#xff0c;抖音生活服务平台上线“跟着大牌过五一”活动会场&#xff0c;携手22家连锁品牌商家&#xff0c;于“五一”前推出优价团购和时令新品&#xff0c;覆盖“吃喝玩乐”多重购物需求&#xff0c;助力假期消费。同时&#xff0c;伴随各地涌现的文旅热潮&#xff…

项目:使用LNMP搭建私有云存储

目录 项目&#xff1a;使用LNMP搭建私有云存储 准备工作 回复快照&#xff0c;关闭安全软件 上传软件 设置nextcloud安装命令权限 设置数据库 重启数据库 配置nginx 安装 内网穿透 cpolar的域名信任 项目&#xff1a;使用LNMP搭建私有云存储 准备工作 回复快照&a…

C#上位机与S7-200Smart通信注意事项

S7-200SMART连接 问题描述 我们使用C#开发上位机和S7-200Smart系列PLC交互数据时&#xff0c;大多会用到Sharp7、Snap7之类的通信类库。有些通信类库默认的使用的是PG连接资源&#xff0c;而对于S7-200Smart来说&#xff0c;它的PG连接资源只有1个。 官网200smart提到的连接数…

解决idea不识别${pageContext.request.contextPath}的方法

文章目录 一、产生原因二、解决方法——直接修改web.xml文件三、修改模板——找到web.xml模板&#xff0c;修改替换 一、产生原因 由于web.xml 使用的web-app版本号过低。导致无法识别"{pageContext.request.contextPath}"。 IDEA在创建javaweb项目的时候&#xff0…

imx6ull配置交叉编译环境编译u-boot及linux所遇问题解决记录

文章目录 前言一、问题 1 及解决方法1、问题 1 描述2、问题 1 解决方法 二、问题 2 及解决方法1、问题 2 描述2、问题 2 解决方法 三、问题 3 及解决方法1、问题 3 描述2、问题 3 解决方法 四、问题 4 及解决方法1、问题 4 描述2、问题 4 解决方法 前言 CoM-iMX6UL(L) 是一款兼…

笔记:能量谱密度与功率谱密度(二)

目录 一、ESD与PSD的定义、单位、性质 二、对ESD与PSD的直观理解 三、总结&#xff1a; 某物理量的“分布”在离散系统中&#xff0c;各点(纵坐标含义&#xff09;的物理意义仍然是该物理量&#xff0c;而在连续系统中&#xff0c;各点&#xff08;纵坐标含义&#xff09;的物…

react报错:Warning: Each child in a list should have a unique “key“ prop.

我是万万没想到的&#xff0c;使用Popconfirm不添加key属性也会报错&#xff1a; react-refresh:160Warning: Each child in a list should have a unique "key" prop. Check the render method of Cell. Seehttps://reactjs.org/link/warning-keys for more informa…

STM32点灯大师(点了一颗LED灯,轮询法)

配置操作&#xff1a; 一、使用CubeMX配置到大致的操作 1.1 选择芯片 1.2 选择引脚&#xff08;根据电路图&#xff09; 1.3 配置gpio口 1.4 配置系统 1.5文件项目操作 最后就是点击 二、点击CubeMX生成的代码&#xff0c;并且修改代码 2.1 看看效果 2.2 写代码

Python 网络编程实践:从基础到进阶

目录 网络编程 一.IP地址简介 1. IP 地址的概念 1.1. IP 地址的表现形式 1.2. IP 地址的作用 2. 查看 IP 地址 3. 检查网络是否正常 4. 小技巧 二.端口和端口号 1. 什么是端口 2. 什么是端口号 3. 端口和端口号的关系 4. 端口号的分类 4.1. 知名端口号 4.2. 动…

【Unity学习笔记】第十四 Prefab 概念解惑

目录 1 prefab、prefab变体、prefab覆盖和prefab 嵌套2 connect 与unpack3 prefab到底是什么&#xff0c;它和gameobject又有什么区别&#xff1f;4 为什么要用prefab&#xff1f;5 代码动态加载prefab6 为什么我unity PrefabUtility.InstantiatePrefab() 得到的是null7 Prefab…

基于Springboot的租房网站

基于SpringbootVue的租房网站的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 房屋信息 交流论坛 房屋资讯 后台登录 用户管理 房屋类型管理 房屋信息管理 预…

关于权限的设计

首先系统权限&#xff0c;每个账号登录后&#xff0c;都需要知道这个账号允许访问哪些api&#xff0c;哪些数据权限&#xff08;一般是指其他账号的一些数据&#xff09; 这里就需要通过角色来关联。 --1.角色绑定菜单&#xff0c;每个菜单设计的时候包含了这个菜单会用到的所…

【成功案例】利用多款国产内网渗透工具勒索数十台虚拟机的babyk解密恢复项目

1.背景 2024年4月11日&#xff0c;某影视公司的服务器遭受了勒索软件攻击&#xff0c;随后向我司寻求帮助进行恢复。经过我司溯源排查&#xff0c;勒索组织通过一处用友NC资产进行入侵&#xff0c;攻击者利用国产工具横移了数小时后实施勒索。其中一台超融合&#xff08;vcente…

监控员工上网有什么软件(2024三款受欢迎的员工上网监控软件盘点)

企业对员工上网行为的有效监管显得愈发重要。 既要确保工作效率与信息安全&#xff0c;又要尊重员工隐私并遵守相关法律法规&#xff0c;选择一款功能强大、合规且易于使用的员工上网监控软件至关重要。 本文将为您介绍2024年三款备受市场欢迎的员工上网监控软件&#xff0c;以…

20232801 2023-2024-2 《网络攻防实践》实践八报告

20232801 2023-2024-2 《网络攻防实践》实践八报告 1.实践内容 1.动手实践任务: 对提供的rada恶意代码样本&#xff0c;进行文件类型识别&#xff0c;脱壳与字符串提取&#xff0c;以获得rada恶意代码的编写作者. 2.动手实践任务二&#xff1a;分析Crackme程序 在WinXP Attac…

LeetCode 每日一题 ---- 【1017.负二进制转换】

LeetCode 每日一题 ---- 【1017.负二进制转换】 1017.负二进制转换方法一&#xff1a;模拟进制转换推广&#xff1a;任意进制转换 1017.负二进制转换 方法一&#xff1a;模拟进制转换 我们平常做进制转换最常用的方法就是辗转相除法&#xff0c;下面的图示分别给出了普通的10…

pmp培训哪家好?高通过率的靠谱机构如何选择

PMP培训机构的选择本来就是一个需要有挑选的人才能顺利进行&#xff0c;所以如果你正好是PMP小白的话一定要抓紧补充一下自己在挑选机构方面的知识&#xff0c;理清自己的需求才能进行多维度的挑选&#xff0c;最后才能选择一个比较合适的机构。已经换证一次的老鸟路过&#xf…
最新文章