首页 > 其他分享 >(第25天)【leetcode题解】二叉树的层序遍历

(第25天)【leetcode题解】二叉树的层序遍历

时间:2024-06-04 15:03:32浏览次数:14  
标签:node 25 int 题解 que 二叉树 push root 节点

目录

429、N叉树的层序遍历

题目描述

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
示例
输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

思路

  • 将root节点放入队列
  • 将root取出,并把它的val放入每一层的容器vec中,同时把它的子节点放入队列中
  • 把每一层的节点值vec放入结果集res中
  • 从队列中取出子节点,把它的值放入vec中,同时把它的子节点放入队列中
  • 循环这个过程,知道队列中没有节点为止

代码

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        queue<Node*> que;
        vector<vector<int>> res;
        if (root != NULL) que.push(root);
        //
        while (!que.empty()) {
            int size = que.size();//每一层的节点数
            vector<int> vec;//存储每一层节点的值
            for (int i = 0; i < size; i++) {//把每一层节点的值都添加到vec中
                Node* node = que.front();
                que.pop();
                vec.push_back(node -> val);
                //把每一个遍历到的节点的子节点都加入到队列中
                for (int i = 0; i < node -> children.size(); i++) {
                    if (node -> children[i]) que.push(node -> children[i]);
                }
            }
            res.push_back(vec);
        }
        return res;
    }
};

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

题目描述

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。
示例
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

思路

  • 借助队列遍历每一层节点
  • 在遍历每层的过程中,获得最大值

代码

class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        queue<TreeNode*> que;
        vector<int> res;
        if (root != NULL) que.push(root);
        while (!que.empty()) {
            int max_val = INT_MIN;
            int size = que.size();
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front();
                que.pop();
                if (node -> val > max_val) max_val = node -> val;
                if (node -> left) que.push(node -> left);
                if (node -> right) que.push(node -> right);
            } 
            res.push_back(max_val);
        }
        return res;
    }
};

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

题目描述

给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例
输入:root = [1,2,3,4,5,6,7]
输出:[1,#,2,3,#,4,5,6,7,#]

思路

  • 在层序遍历的基础上,每次都记录每一层的头部节点,然后在遍历地时候不断把前一个节点指向当前节点

代码

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*> que;
        if (root != NULL) que.push(root);
        while (!que.empty()) {
            Node* nodePre;//前一个节点
            Node* node;//当前节点
            int size = que.size();
            for (int i = 0; i < size; i++) {
                if (i == 0) {
                    nodePre = que.front();
                    que.pop();
                    node = nodePre;
                } else {
                    node = que.front();
                    que.pop();
                    nodePre -> next = node;//把前一个节点指向当前节点
                    nodePre = nodePre -> next;//移动指针到当前节点
                }
                if (node -> left) que.push(node -> left);
                if (node -> right) que.push(node -> right);
            }
            //nodePre -> next = NULL;
    }
        return root;
    }
};

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

题目描述

给定一个二叉树:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。
初始状态下,所有 next 指针都被设置为 NULL 。

思路

  • 对比116题,从完美二叉树变成了普通二叉树。
  • 在116题中采用的逻辑就是在遍历的过程中记录前一个节点,并把前一个节点的next指针指向当前节点。
  • 这样的逻辑在本题也适用。

代码

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node*> que;
        if (root != NULL) que.push(root);
        while (!que.empty()) {
            Node* nodePre;//前一个节点
            Node* node;//当前节点
            int size = que.size();
            for (int i = 0; i < size; i++) {
                if (i == 0) {
                    nodePre = que.front();
                    que.pop();
                    node = nodePre;
                } else {
                    node = que.front();
                    que.pop();
                    nodePre -> next = node;//把前一个节点指向当前节点
                    nodePre = nodePre -> next;//移动指针到当前节点
                }
                if (node -> left) que.push(node -> left);
                if (node -> right) que.push(node -> right);
            }
            nodePre -> next = NULL;//初始状态下,所有指针都被设置成了NULL,因此这行代码可以不加
    }
        return root;
    }
};

104、二叉树的最大深度

题目描述

给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例
输入:root = [3,9,20,null,null,15,7]
输出:3

思路

  • 使用迭代法和层序遍历,二叉树的最大深度就是二叉树的层数

代码

class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == NULL) return 0;
        queue<TreeNode*> que;
        int depth = 0;
        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);
            }

        }
        return depth;
    }
};

111、二叉树的最小深度

题目描述

给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明:叶子节点是指没有子节点的节点。
示例
输入:root = [3,9,20,null,null,15,7]
输出:2

思路

  • 使用层序遍历。
  • 再遍历每一层时,当找到一个节点左右子节点都为空时,表示这个节点是离根节点最近叶子节点。
  • 当前层数就是二叉树的最小深度。

代码

class Solution {
public:
    int minDepth(TreeNode* root) {
        if (root == NULL) return 0;
        queue<TreeNode*> que;
        int depth = 0;
        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;
    }
};

标签:node,25,int,题解,que,二叉树,push,root,节点
From: https://blog.csdn.net/m0_73755059/article/details/139440599

相关文章

  • 2009年408真题解析
    2009年408真题解析【2009.1】为解决计算机主机与打印机之间速度不匹配问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是。A.栈B.队列C.树D.图【知识点】栈和队列特点及应用。【答案】B......
  • 2023-2025年最值得选择的Java毕业设计选题大全:1000个热门选题推荐✅✅✅
    ......
  • 《计算机网络微课堂》实验25 动态主机配置协议DHCP的作用
    下面我们来进行一个仿真实验,本仿真实验的目的在于验证动态主机配置协议DHCP的作用。我已经在软件中构建好了我们理论课中所使用的那个例子,并在各设备旁边标注出了所需的配置信息,我们的应用需求是不给局域网中的各主机手动配置IP地址,子网掩码、默认网关、DNS服务器等信息,而是......
  • 25.Docker 容器镜像制作/Docker 制作容器镜像/Docker 私有镜像仓库
    完成本地hub的搭建,并截图。不使用挂载的方式,而是通过Docker制作的方式实现对Nginx的默认页的修改,把制作的Dockerfile和首页html传到代码仓。推送自己定制好的Nginx镜像到本地镜像仓库hub中,查询本地镜像仓库中的镜像截图。从本地仓库拉取定制好的Nginx镜像,启......
  • CTFshow-Crypto(17-25)
    17EZ_avbv(easy)18贝斯多少呢base62穷举分段给了段编码,hint为base628nCDq36gzGn8hf4M2HJUsn4aYcYRBSJwj4aE0hbgpzHb4aHcH1zzC9C3IL随波逐流和Cyberchef都没梭哈出来看了师傅们的wp大概意思是:分组长度固定,但是不一定是被整除为整数,只要找到从头开始截取一个长度解出明文,就......
  • P10536 [Opoi 2024] 二十六点 题解
    比较直接的做法。当\(P_x=1\)时显然可以暴力DP,设\(f_{x,c}\)表示\(x\)的子树中以\(c\)开头的最长不下降子序列的长度。直接转移即可。\(P_x\neq1\)的时候呢?我们发现,所谓“忽略掉这些路径中的第\(2\)到第\(P_x\)个的点”,代表的就是按照深度转移,大概就是这样:......
  • CF960G Bandit Blues 题解
    我不会斯特林数。CF960GBanditBlues给你三个正整数\(n\),\(a\),\(b\),定义\(A\)为一个排列中是前缀最大值的数的个数,定义\(B\)为一个排列中是后缀最大值的数的个数,求长度为\(n\)的排列中满足\(A=a\)且\(B=b\)的排列个数。\(n\le10^5\),答案对\(998244353\)取......
  • MACSHA256加密生成签名
    再水一篇,也是业务测试中遇到的一种加密方式,这里示例就直接使用相同的加密规则了,可以根据业务场景自行调整加密前字符串加密规则  所有API的请求参数(除去Sign参数),参数名转小写后根据参数名称的AscII表顺序排序;    将排序号的参数名和参数值拼装在一起得到新的字符串A; ......
  • P10550 [THUPC2024] 贸易 题解
    正式场上拿了这题的首\(A\),让队伍不至于无奖而返。思路容易发现题目的买入卖出过程形似一个括号匹配。那么我们可以对每一种类型的物品做括号匹配。若是一个匹配的括号在询问区间内则可以记入答案。就变成了一个二维数点问题。离线树状树组即可。Code#include<bits/stdc......
  • 关于vue关闭页面时去除定时器失效问题解决
    1.先去除页面缓存,这个在路由部分 2.    ......