_15LeetCode代码随想录算法训练营第十五天-C++二叉树

news2024/10/7 8:26:11

_15LeetCode代码随想录算法训练营第十五天-C++二叉树

题目列表

  • 110.平衡二叉树
  • 257.二叉树的所有路径
  • 404.左叶子之和

110.平衡二叉树

题目

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

代码

/*
 * @lc app=leetcode.cn id=110 lang=cpp
 *
 * [110] 平衡二叉树
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int getHeight(TreeNode* node)
    {
        if(node == nullptr)
            return 0;
        int leftH = getHeight(node->left);
        int rightH = getHeight(node->right);
        //如果左子树不平衡,则返回-1
        if(leftH == -1)
            return -1;
        //如果右子树不平衡,则返回-1
        if(rightH == -1)
            return -1;
        //如果左右子树的高度差大于1,则返回-1
        //否则,返回当前node的高度
        if(abs(leftH - rightH) > 1)
            return -1;
        else
            return 1 + max(leftH, rightH);        
    }
    bool isBalanced(TreeNode* root) {
        if(getHeight(root) == -1)
            return false;
        else
            return true;
    }
};
// @lc code=end

257.二叉树的所有路径

题目

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

思路

前序遍历,有回溯。

有递归,就有回溯。
在这里插入图片描述

代码

递归代码

思路清晰代码

/*
 * @lc app=leetcode.cn id=257 lang=cpp
 *
 * [257] 二叉树的所有路径
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traverse(TreeNode* node, vector<int>& path, vector<string>& res)
    {
        //中
        path.push_back(node->val);
        //当node的左孩子和右孩子都为空时,说明遍历到了叶子节点
        if(node->left == nullptr && node->right == nullptr)
        {
            //此时就要将path加入res中
            //先将path转换为string
            string data;
            for(int i = 0; i < path.size() - 1; i++)
            {
                data += to_string(path[i]);
                data += "->";
            }
            //处理最后一个节点
            data += to_string(path[path.size() - 1]);
            res.push_back(data);
            return;
        }
        //左
        if(node->left != nullptr)
        {
            traverse(node->left, path, res);//有递归
            path.pop_back();//有回溯
        }
        //右
        if(node->right != nullptr)
        {
            traverse(node->right, path, res);//有递归
            path.pop_back();//有回溯
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<int> path;
        vector<string> res;
        if(root == nullptr)
            return res;
        traverse(root, path, res);
        return res;
    }
};
// @lc code=end

经典代码

/*
 * @lc app=leetcode.cn id=257 lang=cpp
 *
 * [257] 二叉树的所有路径
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
private:
    //回溯是通过函数的实参path实现的,此参数不是引用不是指针,因此当递归调用时,使用的是临时变量,
    //在本递归中,改变path的值不会改变上一层递归中path的值,由此实现了回溯。
    void traversal(TreeNode* cur, string path, vector<string>& result) {
        path += to_string(cur->val); // 中
        if (cur->left == NULL && cur->right == NULL) {
            result.push_back(path);
            return;
        }
        if (cur->left) traversal(cur->left, path + "->", result); // 左
        if (cur->right) traversal(cur->right, path + "->", result); // 右
    }
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        string path;
        if (root == NULL) return result;
        traversal(root, path, result);
        return result;
    }
};
// @lc code=end

非递归代码

/*
 * @lc app=leetcode.cn id=257 lang=cpp
 *
 * [257] 二叉树的所有路径
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> res;
        //此栈存储TreeNode*
        stack<TreeNode*> stTree;
        //此栈存储路径
        stack<string> stRes;
        if(root == nullptr)
            return res;
        stTree.push(root);
        stRes.push(to_string(root->val));
        while(!stTree.empty())
        {
            TreeNode* node = stTree.top();
            stTree.pop();
            string path = stRes.top();
            stRes.pop();
            if(node->left == nullptr && node->right == nullptr)
                res.push_back(path);
            if(node->left != nullptr)
            {
                stTree.push(node->left);
                stRes.push(path + "->" + to_string(node->left->val));
            }
            if(node->right != nullptr)
            {
                stTree.push(node->right);
                stRes.push(path + "->" + to_string(node->right->val)); 
            }
        }
        return res;
    }
};
// @lc code=end

404.左叶子之和

题目

给定二叉树的根节点 root ,返回所有左叶子之和。
在这里插入图片描述

整体思路

左叶子的明确定义:节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点
在这里插入图片描述

代码

递归代码

/*
 * @lc app=leetcode.cn id=404 lang=cpp
 *
 * [404] 左叶子之和
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //根据父节点判断左孩子是否是左叶子
    int sumOfLeftLeaves(TreeNode* root) {
        if(root == nullptr)
            return 0;
        if(root->left == nullptr && root->right == nullptr)
            return 0;
        //遍历左子树
        int leftValue = sumOfLeftLeaves(root->left);
        if(root->left != nullptr && root->left->left == nullptr && root->left->right == nullptr)
            leftValue = root->left->val;
        //遍历右子树
        int rightValue = sumOfLeftLeaves(root->right);
        return leftValue + rightValue;
    }
};
// @lc code=end

非递归代码

/*
 * @lc app=leetcode.cn id=404 lang=cpp
 *
 * [404] 左叶子之和
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    //根据父节点判断左孩子是否是左叶子
    //就是遍历一遍所有元素,然后将需要的元素加起来
    int sumOfLeftLeaves(TreeNode* root) {
        queue<TreeNode*> que;
        int res = 0;
        if(root != nullptr)
            que.push(root);
        while(!que.empty())
        {
            TreeNode* node = que.front();
            que.pop();
            if(node->left != nullptr && node->left->left == nullptr && node->left->right == nullptr)
                res += node->left->val;
            if(node->left != nullptr)
                que.push(node->left);
            if(node->right != nullptr)
                que.push(node->right);
        }
        return res;
    }
};
// @lc code=end

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

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

相关文章

雪花算法和uuid比较

1. 雪花算法 ​ 现在的服务基本是分布式、微服务形式的&#xff0c;而且大数据量也导致分库分表的产生&#xff0c;对于水平分表就需要保证表中 id 的全局唯一性。对于 MySQL 而言&#xff0c;一个表中的主键 id 一般使用自增的方式&#xff0c;但是如果进行水平分表之后&…

结构体(10)

目录 1、结构体的声明 1、结构体的声明 2、结构体变量的定义和初始化 2、结构体成员的访问 3、结构体传参 1、结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1、结构体的声明 例如&#xff1a;描述一个学生 注…

KOOM线上APM监控最全剖析

APM&#xff0c;全称是Application Performance Management&#xff0c;也就是应用性能管理&#xff0c;这与我们平时写的业务可能并不相关&#xff0c;但是却承载着App线上稳定的责任。当一款App发布到线上之后&#xff0c;不同的用户有不同场景&#xff0c;一旦App出现了问题…

【云原生系列CKA备考】新建虚拟机安装Ubuntu20.04系统

目录一、环境准备二 、安装虚拟机设置网络其他操作手册&#xff1a;安装 kubeadm 一台兼容的 Linux 主机(或者云主机)。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令。 每台机器 2 GB 或更多的 RAM&#xff08;如果…

数据库,计算机网络、操作系统刷题笔记18

数据库&#xff0c;计算机网络、操作系统刷题笔记18 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

红中私教:计网那点事(1)

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1f342;专栏地址&#xff1a;网安专栏 光明神已陨落&#xff0c;现在 由计网引领我 破戒了&#xff0c;本来…

前端开发:Vue封装通过API调用的组件的方法

前言 在前端开发中&#xff0c;关于Vue的使用相比大家并不陌生&#xff0c;而且Vue框架的优势也是其他框架所不能比的&#xff0c;尤其是Vue的封装思想更是堪称一绝&#xff0c;还有就是组件化的运用实践过程也是亮点。所以关于Vue框架的使用想必看官都不陌生&#xff0c;而且常…

TCP 的主要特点(计算机网络-运输层)

目录 传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09; TCP 连接与面向字节流的概念 TCP 的连接 UDP与TCP复用的区别 传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09; TCP 是面向连接的运输层协议 …

【算术】数据结构

MySQL性能优化1、数据结构前言2、常见的数据结构2.1 线性表2.1.1 数组2.1.2 链表2.1.3 栈2.1.4 队列2.2 散列表2.3 树2.3.1 二叉树2.4 图1、数据结构前言 数据结构(data structure)是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合&#xff…

【工作流Activiti7】6、Activiti 7 源码学习

1. 启动分析 源码版本是 7.1.0.M6 首先从 ProcessEngineAutoConfiguration 开始 ProcessEngineAutoConfiguration 是activiti-spring-boot-starter 7.1.0.M6自动配置的入口类&#xff0c;在这里主要看 SpringProcessEngineConfiguration 主要是配置了自动部署 最最最重要的…

后渗透攻击(三)

目录 1、创建新账户 2、获取账号密码 3、远程屏幕控制 在进行提权后我们的操作空间就会大很多&#xff0c;可以进行一系列的创建新账户、获取账号密码、远程操控屏幕等等的操作。该文章就对一些常用的操作进行了整理。 1、创建新账户 查看目标靶机已存在用户 可以在meter…

[Jule CTF 2022] 部分WP

这个比赛参加的人极少&#xff0c;比赛有一星期那么长&#xff0c;快结束的时候来了个大牛&#xff0c;一下上到12000&#xff0c;我这6K只能排到第二了。不过题还是挺不错的。只是入口不是人链接&#xff0c;得自己输才能进&#xff0c;可能很多人因为这个没参加。 Crypto E…

【工作流Activiti7】5、Activiti7 多实例子流程

顾名思义&#xff0c;子流程是一个包含其他活动、网关、事件等的活动&#xff0c;这些活动本身形成了一个流程&#xff0c;该流程是更大流程的一部分。 使用子流程确实有一些限制&#xff1a; 一个子流程只能有一个none类型的启动事件&#xff0c;不允许有其他类型的启动事件…

C语言—结构体

结构体&#xff1a;将不同数据类型组合成一个新的数据类型&#xff1b; #include <stdio.h> struct Person {char name[50];int age;bool gender; }; int main() {} 定义了一个结构体Person&#xff0c;它包含一个字符数组成员name&#xff0c;int类型的age和bool类型的…

【生信原理】初探芯片表达谱分析

初探芯片表达谱分析 文章目录初探芯片表达谱分析实验目的实验内容实验题目实验过程数据的获取、解压与读取数据预处理&#xff08;背景纠正、标准化和探针信号汇总等&#xff09;数据过滤&#xff08;探针过滤&#xff09;探针注释&#xff08;添加基因注释信息&#xff09;lim…

Excel之INDIRECT函数实现某列元素上下翻转

Excel之INDIRECT函数实现某列元素上下翻转方法1&#xff1a;降序按钮1.0 使用条件1.1 选中元素序号列->排序和筛选->降序1.2 排序提醒对话框->排序1.3 处理后结果方法2&#xff1a;Indirect函数2.0 方法一的不足。2.1 INDIRECT函数处理及结果2.2 空白单元格的恢复及结…

客快物流大数据项目(一百):ClickHouse的使用

文章目录 ClickHouse的使用 一、使用Java操作ClickHouse 1、构建maven工程

用HTML+CSS构建一个绚丽的登录页面

用HTMLCSS构建一个绚丽的登录页面 参考文章&#xff1a; 动态水滴页面 自动切换背景的登录页面 登录页面代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" c…

[~/vulhub]/log4j/CVE-2021-44228-20221225

[~/vulhub]/log4j/CVE-2021-44228 ┌──(kwkl㉿kwkl)-[~/vulhub] └─$ cd log4j/CVE-2021-44228 ┌──(kwkl㉿kwkl)-[~/vulhub/log4j/CVE-2021-44228] └─$ dir 1.png 2.png docker-compose.yml README.md README.zh-cn.md┌──(kwkl㉿kwkl)-[~/vulhub/log4j/CVE-2021…

JSP ssh学生信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh 学生信息管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…