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

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

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

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[[15,7],[9,20],[3]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

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

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:

输入: []
输出: []
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]
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叉树的定义

class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

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

包含 一个值和孩子数组

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

相关推荐

  1. 练习】103. 的锯齿形

    2024-04-09 17:40:02       45 阅读
  2. -

    2024-04-09 17:40:02       9 阅读
  3. 】102.

    2024-04-09 17:40:02       12 阅读
  4. 】107. II

    2024-04-09 17:40:02       14 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 17:40:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 17:40:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 17:40:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 17:40:02       20 阅读

热门阅读

  1. 面试前必看,仅供参考

    2024-04-09 17:40:02       15 阅读
  2. 蓝桥杯算法题:蓝桥公园

    2024-04-09 17:40:02       16 阅读
  3. 图神经网络学习记录——图信号处理常见方法

    2024-04-09 17:40:02       12 阅读
  4. python pytest 面试题

    2024-04-09 17:40:02       16 阅读
  5. spring获取bean

    2024-04-09 17:40:02       12 阅读
  6. # 计算机视觉入门

    2024-04-09 17:40:02       15 阅读
  7. 算法刷题记录 Day41

    2024-04-09 17:40:02       13 阅读
  8. 外观模式(面子模式)

    2024-04-09 17:40:02       12 阅读
  9. uni-app中的地图简单说明 map

    2024-04-09 17:40:02       14 阅读