zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    40个你可能不知道的Python的特点和技巧
    Python Streaming实战2: Join的实现与数据过滤
    python + Streaming框架的MR实践与优化
    python编码最佳实践之总结
    Python自然语言处理系列之模拟退火算法
    Python自然语言处理
    机器学习实践中的 7 种常见错误
    玩转python主题模型程序库gensim
    Python自然语言处理
    glusterfs
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9162360.html
Copyright © 2011-2022 走看看