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

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函数同名

相关推荐
哭泣的眼泪4081 小时前
解析粗糙度仪在工业制造及材料科学和建筑工程领域的重要性
python·算法·django·virtualenv·pygame
清炒孔心菜1 小时前
每日一题 LCR 078. 合并 K 个升序链表
leetcode
Ysjt | 深1 小时前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__1 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
Microsoft Word2 小时前
c++基础语法
开发语言·c++·算法
天才在此2 小时前
汽车加油行驶问题-动态规划算法(已在洛谷AC)
算法·动态规划
一只小小汤圆2 小时前
opencascade源码学习之BRepOffsetAPI包 -BRepOffsetAPI_DraftAngle
c++·学习·opencascade
legend_jz2 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法
嘿BRE3 小时前
【C++】几个基本容器的模拟实现(string,vector,list,stack,queue,priority_queue)
c++