• LeetCode(102):二叉树的层次遍历


    Medium!

    题目描述:

    给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

    例如:
    给定二叉树: [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    返回其层次遍历结果:

    [
      [3],
      [9,20],
      [15,7]
    ]

    解题思路:

    层序遍历二叉树是典型的广度优先搜索BFS的应用,但是这里稍微复杂一点的是,我们要把各个层的数分开,存到一个二维向量里面。

    大体思路还是基本相同的,建立一个queue,然后先把根节点放进去,这时候找根节点的左右两个子节点,这时候去掉根节点,此时queue里的元素就是下一层的所有节点,用一个for循环遍历它们,然后存到一个一维向量里,遍历完之后再把这个一维向量存到二维向量里,以此类推,可以完成层序遍历。

    C++解法一:

     1 // Iterative
     2 class Solution {
     3 public:
     4     vector<vector<int> > levelOrder(TreeNode *root) {
     5         vector<vector<int> > res;
     6         if (root == NULL) return res;
     7 
     8         queue<TreeNode*> q;
     9         q.push(root);
    10         while (!q.empty()) {
    11             vector<int> oneLevel;
    12             int size = q.size();
    13             for (int i = 0; i < size; ++i) {
    14                 TreeNode *node = q.front();
    15                 q.pop();
    16                 oneLevel.push_back(node->val);
    17                 if (node->left) q.push(node->left);
    18                 if (node->right) q.push(node->right);
    19             }
    20             res.push_back(oneLevel);
    21         }
    22         return res;
    23     }
    24 };

    下面我们来看递归的写法,核心就在于我们需要一个二维数组,和一个变量level,当level递归到上一层的个数时,我们新建一个空层,继续往里面加数字。

    C++解法二:

     1 // Recursive
     2 class Solution {
     3 public:
     4     vector<vector<int>> levelOrder(TreeNode* root) {
     5         vector<vector<int> > res;
     6         levelorder(root, 0, res);
     7         return res;
     8     }
     9     void levelorder(TreeNode *root, int level, vector<vector<int> > &res) {
    10         if (!root) return;
    11         if (res.size() == level) res.push_back({});
    12         res[level].push_back(root->val);
    13         if (root->left) levelorder(root->left, level + 1, res);
    14         if (root->right) levelorder(root->right, level + 1, res);
    15     }
    16 };
  • 相关阅读:
    Spark学习笔记2(spark所需环境配置
    Spark学习笔记1(初始spark
    zookeeper基本讲解及基本命令和配置 (转)
    计算机网络面试常考(转载)
    C++面试笔试题汇总
    复杂指针解析
    如何限制一个类对象只在栈(堆)上分配空间?
    虚函数实现机制
    C++内存分配方式详解
    C++中指针和引用的区别(转载)
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9162360.html
Copyright © 2020-2023  润新知