LeetCode题解 二叉树(四):我要打十个?层序遍历变式九道

news2024/11/15 5:59:20

前言:

本篇涉及的题目都与10 二叉树的层序遍历有关,共九道题

  • 107.二叉树的层次遍历II medium
  • 199.二叉树的右视图 medium
  • 637.二叉树的层平均值 easy
  • 429.N叉树的前序遍历 medium
  • 515.在每个树行中找最大值 medium
  • 116.填充每个节点的下一个右侧节点指针 medium
  • 117.填充每个节点的下一个右侧节点指针II medium
  • 104.二叉树的最大深度 easy
  • 111.二叉树的最小深度 easy

正文

107 二叉树的层序遍历II medium

给定一个二叉树,返回其节点值自底向上的层次遍历。

和上一题相比,只是需要翻转一下最后结果而已,代码如下:

vector<vector<int>> levelOrderBottom(TreeNode* root) {
        queue<TreeNode*> que;
        vector<vector<int>> res;
        if (root) que.push(root);
        while (!que.empty()) {
            int size = que.size();
            vector<int> vec;
            for (int i = 0; i < size; i++) {
                TreeNode *temp = que.front();
                que.pop();
                vec.push_back(temp->val);
                if (temp->left) que.push(temp->left);
                if (temp->right) que.push(temp->right);
            }
            res.push_back(vec);
        }
        reverse(res.begin(), res.end());
        return res;
    }

199 二叉树的右视图 medium

做这道题首先要知道什么叫做二叉树的右视图,理解起来也简单,和初中学三视图的时候没什么两样,如下图所示,站在二叉树的右边,返回右侧能看到的所有值。

img

此处就要明确,如果当前层最右边有结点,如上图的结点4,将4加入结果就可以了。但如果没有呢?就需要将5加入节点,基于此要做一个判断。

那么怎么判断呢?其实也不难,当我们把每一层都加入队列后,最后一个元素,就是改层最右边的值,也是右视图能看见的值。

其余的和普通的层序遍历没有什么区别,代码如下:

vector<int> rightSideView(TreeNode* root) {
    queue<TreeNode*> que;
    vector<int> res;
    if (root) que.push(root);
    while (!que.empty()) {
        int size = que.size();
        for (int i = 0; i < size; i++) {
            TreeNode *temp = que.front();
            que.pop();
            if (i == (size - 1)) res.push_back(temp->val);
            if (temp->left) que.push(temp->left);
            if (temp->right) que.push(temp->right);
        }
    }
    return res;
}

637 二叉树的层平均值 easy

这,没什么可说的了,就是做一次普通的层序遍历,然后求一下每层的平均值而已。

代码如下:

vector<double> averageOfLevels(TreeNode* root) {
    queue<TreeNode*> que;
    vector<double> res;
    if (root) que.push(root);
    while (!que.empty()) {
        int size = que.size();
        double sum = 0;
        for (int i = 0; i <size; i++) {
            TreeNode *temp = que.front();
            que.pop();
            sum += temp->val;
            if (temp->left) que.push(temp->left);
            if (temp->right) que.push(temp->right);
        }
        res.push_back(sum / size);
    }
    return res;
}

429 N叉树的层序遍历 medium

不同之处在于,遍历子结点的时候,要用循环处理,其余和二叉树的层序遍历没什么区别,代码如下:

vector<vector<int>> levelOrder(Node* root) {
    queue<Node*> que;
    vector<vector<int>> res;
    if (root) que.push(root);
    while (!que.empty()) {
        int size = que.size();
        vector<int> vec;
        for (int i = 0; i < size; i++) {
            Node *cur = que.front();
            que.pop();
            vec.push_back(cur->val);
            // 此处为不同之处
            for (int j = 0; j < cur->children.size(); j++) {
                if (cur->children[j]) que.push(cur->children[j]);
            }
        }
        res.push_back(vec);
    }
    return res;
}

515 在每个树行中找最大值 medium

层序遍历,取每一层的最大值

vector<int> largestValues(TreeNode* root) {
        queue<TreeNode*> que;
        if (root != NULL) que.push(root);
        vector<int> result;
        while (!que.empty()) {
            int size = que.size();
            int maxValue = INT_MIN; // 取每一层的最大值
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                maxValue = node->val > maxValue ? node->val : maxValue;
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
            result.push_back(maxValue); // 把最大值放进数组
        }
        return result;
    }

116 填充每个节点的下一个右侧结点指针 medium

(这道题的题目给我一种日式轻小说的错觉

首先要明白题意,在这道题下,每个节点有一个next指针,需要让该指针指向右侧的结点,如下图所示:

116.填充每个节点的下一个右侧节点指针

本质还是层序遍历,但需要用每一层的第一个节点,并且记录上一个结点,令其指向当前结点,代码如下:

Node* connect(Node* root) {
        queue<Node*> que;
        if (root) que.push(root);
        while (!que.empty()) {
            int size = que.size();
            for (int i = 0; i < size; i++) {
                Node* node = que.front();
                que.pop();
                // 如果不是本层的最后一个
                if (i != size -1) {
                    // 当前结点指向本层的下一个结点
                    node->next = que.front();
                } else 
                    node->next = NULL;
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
        }
        return root;
    }

其实这道题,如果用递归来做,会简洁很多,LeetCode官方版代码如下:

private:
    void traversal(Node* cur) {
        if (cur == NULL) return;
                                // 中
        if (cur->left) cur->left->next = cur->right; // 操作1
        if (cur->right) {
            if (cur->next) cur->right->next = cur->next->left; // 操作2
            else cur->right->next = NULL;
        }
        traversal(cur->left);   // 左
        traversal(cur->right);  // 右
    }
public:
    Node* connect(Node* root) {
        traversal(root);
        return root;
    }

117 填充每个节点下一个右侧节点指针II medium

和116的区别在于,这道题说的不是完全二叉树了,官方示例见下图:

img

但是思想还是一致的,我们直接用116的题解,就可以通过(LeetCode你有些偷懒啊)

代码如下,还是放一遍吧:

Node* connect(Node* root) {
        queue<Node*> que;
        if (root) que.push(root);
        while (!que.empty()) {
            int size = que.size();
            for (int i = 0; i < size; i++) {
                Node* node = que.front();
                que.pop();
                // 如果不是本层的最后一个
                if (i != size -1) {
                    // 当前结点指向本层的下一个结点
                    node->next = que.front();
                } else 
                    node->next = NULL;
                if (node->left) que.push(node->left);
                if (node->right) que.push(node->right);
            }
        }
        return root;
    }

104 二叉树的最大深度 easy

本质还是层序遍历,记录一共遍历了多少层就行,代码如下:

int maxDepth(TreeNode* root) {
    if (!root) return 0;
    int depth = 0;
    queue<TreeNode*> que;
    que.push(root);
    while (!que.empty()) {
        int size = que.size();
        for (int i = 0; i < size; i++) {
            TreeNode *node = que.front();
            que.pop();
            if (node->left) que.push(node->left);
            if (node->right) que.push(node->right);
        }
        depth++;
    }
    return depth;
}

111 二叉树的最小深度 easy

还是层序遍历,但是要注意一点,如果某个结点的左右子树都为空,就说明已经达到最小深度的那一层了,多了一个判断,代码如下:

int minDepth(TreeNode* root) {
    if (root == NULL) return 0;
    int depth = 0;
    queue<TreeNode*> que;
    que.push(root);
    while(!que.empty()) {
        int size = que.size();
        depth++; // 记录最小深度
        for (int i = 0; i < size; i++) {
            TreeNode* node = que.front();
            que.pop();
            if (node->left) que.push(node->left);
            if (node->right) que.push(node->right);
            if (!node->left && !node->right) { 
                return depth;
            }
        }
    }
    return depth;
}

这道题也可以用递归来做,代码如下:

int minDepth(TreeNode* root) {
    if (root == NULL) return 0;
    if (root->left == NULL && root->right != NULL) {
        return 1 + minDepth(root->right);
    }
    if (root->left != NULL && root->right == NULL) {
        return 1 + minDepth(root->left);
    }
    // 相当于左右子树都是空的
    return 1 + min(minDepth(root->left), minDepth(root->right));
}

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

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

相关文章

机器学习——详解判别模型求解分类问题

目录 逻辑回归 判别模型(discriminative model) 设计模型Function set设计函数选择最好的w和b更新参数w和b 逻辑回归与线性回归对比 逻辑回归为什么用交叉熵来找最优的参数而不用MAE或MSE GM与DM区别 多维分类——以三类别为例 GM 生成模型DM 判别模型 输入特征处理→深度学习…

财务人员学Python有用吗?

财务人员学Python有用吗&#xff1f;作为财务人员每天面对大量的数据&#xff0c;财务人员用Python做小工具&#xff0c;录单审凭证不到1分钟就搞定了。把更多的时间花在财务分析上&#xff0c;更好更快地完成工作。 Python作为一门编程语言&#xff0c;属于IT技术自动化技术、…

Python:遗传算法最优路径

Hello&#xff0c;大家好&#xff01;读研前写过一篇遗传算法的代码&#xff0c;比较简单&#xff0c;算是个入门&#xff0c;当时就有想用它来解决最优路径的问题&#xff0c;上算法导论课时碰巧有听到同学有分享过&#xff0c;但由于自己研究的方向不是这块&#xff0c;就没有…

【LeetCode每日一题】——968.监控二叉树

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 树 二【题目难度】 困难 三【题目编号】 968.监控二叉树 四【题目描述】 给定一个二叉树&…

入门:从虚拟机到容器

从虚拟机到容器 前面我们成功安装了Docker学习环境&#xff0c;以及浅尝了一下Docker为我们带来的应用快速部署。在正式进入学习之前&#xff0c;我们就先从Docker的发展开始说起。 在Docker出现之前&#xff0c;虚拟化技术可以说是占据了主导地位。首先我们来谈谈为什么会出现…

Adobe Pro DC 2022 软件详细安装教程

一、软件下载 网盘链接&#xff1a;Adobe Pro DC 2022 提取码:ib19 二、详细安装教程 1、解压安装包&#xff0c;右键安装程序Set-up&#xff0c;点击以管理员身份运行 2、更改软件安装位置&#xff0c;建议安装至除C盘外的其他盘&#xff08;如不需更改直接点击【继续】即可…

自学编程的朋友,我想给你们这 5 个建议

0基础学编程&#xff0c;我想给你这 5 个建议 很多人都想转行互联网&#xff0c;不管是出于兴趣、行业前景还是薪资的考虑&#xff0c;想要转行互联网的人们必须要面对一个问题&#xff0c;那就是如何自学编程&#xff0c;更确切的说&#xff0c;是如何0基础学编程。 其实我基…

小师弟:2022广东省工科赛分享(越障排爆省一,完整项目)

目录日常唠嗑前言一、实验效果二、赛题分析及方案1、赛题内容&#xff1a;初赛&#xff1a;决赛&#xff1a;2、实施方案&#xff1a;三、材料选择四、程序设计程序思路PID&#xff1a;越障部分&#xff1a;颜色识别部分&#xff1a;五、竞赛心得六、工程获取日常唠嗑 小师弟说…

J-002 Jetson电路设计之电源设计--NANO XAVIER NX

Jetson电源设计1 电源说明1.1 电源和系统引脚描述1.2 电源控制框图详情2 上电的时许2.1 框图分析2.2 上电时序3 GND引脚1 电源说明 Jetson NANO和XAVIER NX核心板的电源为DC-5V。 1.1 电源和系统引脚描述 PIN名称描述方向类型251-260VDD_IN主电源输入5.0V235PMIC_BBATRTC时钟…

深入剖析Linux RCU原理(二)-渐入佳境

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 我会假设你已经看过了深入剖析Linux RCU原理&#xff08;一&#xff09;初窥门径 本文将进一步去探索下…

设计模式4 - 行为型模式

23种设计模式分析与见解开篇、UML、软件设计原则https://blog.csdn.net/lili40342/article/details/128358435创建型模式https://blog.csdn.net/lili40342/article/details/128358392结构型模式https://blog.csdn.net/lili40342/article/details/128358313行为型模式https://bl…

【GRU时序预测】基于matlab卷积神经网络结合门控循环单元CNN-GRU时间序列预测【含Matlab源码 2287期】

⛄一、CNN-GRU数据预测 1 理论基础 1.1 CNN算法 负荷序列数据为一维数据&#xff0c;用一维卷积核对数据进行卷积处理&#xff0c;以获取数据的特征。 现设定卷积核的维度为3&#xff0c;移动步长为1&#xff0c;对输入数据进行卷积&#xff0c;以获得特征图图谱&#xff0c;即…

转行AI产品经理的学习过程

学习内容及思考 引言 当别人问你为什么转行AI产品经理&#xff1f; 你回答因为自己喜欢。 这是一句多么空洞的话呀&#xff0c;苍白又无力&#xff0c;那你为什么喜欢呢&#xff1f;你了解他么&#xff1f;仅凭自己这一腔热情&#xff0c;一句轻描淡写的我喜欢&#xff0c;是…

行为树 --- [7] BehaviorTree.CPP 4.x版本的编译及使用

根据BehaviorTree.CPP的官方介绍&#xff0c;3.x版本已经不再维护了&#xff0c;建议使用4.x版本&#xff0c; 4.x版本和3.x版本的区别可以看这里 — https://www.behaviortree.dev/migration 本文介绍4.x版本的编译及使用&#xff0c;环境是Debian 10.5&#xff0c;编译器是…

笔试强训(四十七)

目录一、选择题二、编程题2.1 合唱团2.1.1 题目2.1.2 题解2.2 马戏团2.2.1 题目2.2.2 题解一、选择题 &#xff08;1&#xff09;对于IP地址130.63.160.2&#xff0c;MASK为255.255.255.0&#xff0c;子网号为&#xff08;B&#xff09; A.160.2 B.160 C.63.160 D.130.63.160 …

学Python好找工作吗?需要满足Python岗位哪些要求?

学Python好找工作吗&#xff1f;需要满足哪些要求&#xff1f;随着Python的火爆&#xff0c;国内Python的岗位也随之增多&#xff0c;只要技术能力强项目经验充足&#xff0c;找到工作不是问题。即使是一些二线城市&#xff0c;Python的薪资待遇也比较好。 一、学Python好找工作…

学习编程的中小学生越来越多,是盲目追风,还是确有其用?!

首先&#xff0c;中小学生为什么要学习编程?未来社会&#xff0c;随姜信息技术和人工智能的发展&#xff0c;越来越多行业的工作离不开编程。美国前总统奥巴马就呼吁:“如果我们想让美国保持地位&#xff0c;就需要年轻代的美国人掌握这种(编程)工具和技术,它将改变我们所有的…

最简单的canvas基础+实践,确定不进来看看嘛

前言 怎么突然提到 canvas 呢❓其实是因为工作中有一个小需求&#xff0c;就是给特定的区域做水印&#x1f624;&#xff0c;思来想去&#x1f60e;就选择使用 canvas 去做&#xff0c;简单效果如下&#xff1a; 实现思路&#x1f937;‍♂️&#xff1a;封装一个全局指令&am…

新装的Ubuntu无法连接有线(无有线标志)

解决方法 1、lspci命令&#xff08;查看网卡型号&#xff09; labhlab:~$ lspci 00:00.0 Host bridge: Intel Corporation Device 4660 (rev 02) 00:01.0 PCI bridge: Intel Corporation Device 460d (rev 02) 00:06.0 PCI bridge: Intel Corporation Device 464d (rev 02) 0…

【图像增强】局部对比度增强的CLAHE算法直方图增强【含Matlab源码 1341期】

⛄一、简介 基于matlab局部对比度增强的CLAHE算法直方图增强 ⛄二、部分源代码 %% tic %% 清空工作区与变量 clc; clear; for image_number1:1 imageNamestrcat(num2str(image_number),‘.jpg’); img imread(imageName); %% 在LAB空间进行去雾 % RGB转LAB transform mak…