力扣刷题 二叉树层序遍历相关题目

NO.107 二叉树的层次遍历 II

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

示例 1:

复制代码
输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

复制代码
输入:root = [1]
输出:[[1]]

示例 3:

复制代码
输入:root = []
输出:[]

这道题目只需要把层序遍历完的结果数组反转一下即可。

cpp 复制代码
class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
          vector<vector<int>> result;
          queue<TreeNode*> que;
          if(root != NULL){
            que.push(root);
          }
          while(!que.empty()){
            //建立每一层的数组
            vector<int> vec;
            // 如何判断每一层的个数
            //记录队列的大小
            int size = que.size();
            // 遍历队列,放入数组
             for(int i = 0; i < size; i++ ){
                //出队列第一个元素放入数组
                TreeNode* node = que.front();
                vec.push_back(node->val);
                //将左右节点入队列
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
                //将当前节点弹出
                que.pop();
             } 
             // 将这一层的数组放入结果数组
             result.push_back(vec);
          }
    reverse(result.begin(),result.end());
    return result;

    }
};

ps:reverse函数直接用就行,不需要赋值,result =

NO.199 二叉树的右视图

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

复制代码
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

复制代码
输入: [1,null,3]
输出: [1,3]

示例 3:

复制代码
输入: []
输出: []
cpp 复制代码
class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
         vector<int> result;
          queue<TreeNode*> que;
          if(root != NULL){
            que.push(root);
          }
          while(!que.empty()){
            // 如何判断每一层的个数
            //记录队列的大小
            int size = que.size();
            // 遍历队列,放入数组
             for(int i = 0; i < size; i++ ){
                //出队列第一个元素放入数组
                TreeNode* node = que.front();
                //将左右节点入队列
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
                //如果是这一层最后一个元素,就放入数组
                if(i == size - 1)
                    result.push_back(node->val);
                //将当前节点弹出
                que.pop();
             } 
          }
    return result;
    }
};

ps:不能直接用queue.back()放入最后一个元素,因为需要遍历队列,把左右节点放入队列。

NO.637 二叉树的层平均值

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

复制代码
输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。

示例 2:

复制代码
输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]
cpp 复制代码
class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
          vector<double> result;
          queue<TreeNode*> que;
          if(root != NULL){
            que.push(root);
          }
          while(!que.empty()){
            // 如何判断每一层的个数
            //记录队列的大小
            double size = que.size();
            double sum = 0;
            // 遍历队列,放入数组
             for(int i = 0; i < size; i++ ){
                //出队列第一个元素
                TreeNode* node = que.front();
                //用sum记录每一层的和
                sum += node->val;
                //将左右节点入队列
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
                //将当前节点弹出
                que.pop();
             } 
             //当这一层遍历完后,放入平均值
             result.push_back(sum/size);
          }
    return result;
    }
};

ps:因为除法会产生小数,所以要都改成double类型

注意sum建立的位置,应该是在遍历之前,不然每遍历一个都会刷新。

NO.429 N叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

复制代码
输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:

复制代码
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

N叉树的定义

cpp 复制代码
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};

包含 一个值和孩子数组

cpp 复制代码
class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
          vector<vector<int>> result;
          queue<Node*> que;
          if(root != NULL){
            que.push(root);
          }
          while(!que.empty()){
            //建立每一层的数组
            vector<int> vec;
            // 如何判断每一层的个数
            //记录队列的大小
            int size = que.size();
            // 遍历队列,放入数组
             for(int i = 0; i < size; i++ ){
                //出队列第一个元素放入数组
                Node* node = que.front();
                vec.push_back(node->val);
                //将孩子节点入队列
                for(int i = 0; i < node->children.size();i++){
                    if(node->children[i]) que.push(node->children[i]);
                }
                //将当前节点弹出
                que.pop();
             } 
             // 将这一层的数组放入结果数组
             result.push_back(vec);
          }
    return result;
    }
};

如何将所有的孩子节点入队是重点

NO.515 在每个树行中找最大值

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

复制代码
输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例2:

复制代码
输入: root = [1,2,3]
输出: [1,3]
cpp 复制代码
class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
          vector<int> result;
          queue<TreeNode*> que;
          if(root != NULL){
            que.push(root);
          }
          while(!que.empty()){
            //建立每一层的数组
            vector<int> vec;
            // 如何判断每一层的个数
            //记录队列的大小
            int size = que.size();
            //用maxn记录最大值
            int maxn = INT_MIN;
            // 遍历队列,放入数组
             for(int i = 0; i < size; i++ ){
                //出队列第一个元素放入数组
                TreeNode* node = que.front();
                maxn = max(maxn,node->val);
                //将左右节点入队列
                if(node->left) que.push(node->left);
                if(node->right) que.push(node->right);
                //将当前节点弹出
                que.pop();
             } 
             // 将这一层的最大值放入结果数组
             result.push_back(maxn);
          }
    return result;
    }
};

ps:记录最大值的变量不能与max函数同名

相关推荐
文丑颜不良啊10 小时前
LeetCode2461~2480题目解析
java·leetcode
努力努力再努力wz11 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化11 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu11 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
文丑颜不良啊12 小时前
LeetCode2441~2460题目解析
java·leetcode
ShineWinsu13 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
文丑颜不良啊13 小时前
LeetCode2521~2540题目解析
java·leetcode
坤坤子吖13 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
lisw0513 小时前
Dayhoff的PAM替换矩阵理论评介!
线性代数·算法·矩阵
一起学安全技术14 小时前
拆大模型 03|注意力的一句话版本:不用论文讲清 Attention
深度学习·算法·语言模型·transformer