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

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

相关推荐
passer__jw76726 分钟前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾32 分钟前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序40 分钟前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒1 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
王哈哈^_^2 小时前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
星沁城2 小时前
240. 搜索二维矩阵 II
java·线性代数·算法·leetcode·矩阵
脉牛杂德2 小时前
多项式加法——C语言
数据结构·c++·算法
legend_jz2 小时前
STL--哈希
c++·算法·哈希算法
CSUC2 小时前
【C++】父类参数有默认值时子类构造函数列表中可以省略该参数
c++