zoukankan      html  css  js  c++  java
  • LeetCode--Binary Tree Level Order Traversal

    Binary Tree Level Order Traversal

    这几个题目相似。都是用同样的递归法,时间空间复杂度都为O(n).

    当然,还有迭代法,控件复杂度会降至 O(1),这个暂不讨论。

    Binary Tree Level Order Traversal

    // 递归版,时间复杂度 O(n),空间复杂度 O(n) class Solution {
    public:
          vector<vector<int> > levelOrder(TreeNode *root) {
              vector<vector<int>> result;
              traverse(root, 1, result);
              return result;
    }
          void traverse(TreeNode *root, size_t level, vector<vector<int>> &result) {
              if (!root) return;
              if (level > result.size())
                  result.push_back(vector<int>());
              result[level-1].push_back(root->val);
              traverse(root->left, level+1, result);
              traverse(root->right, level+1, result);
    } };

    Binary Tree Level Order Traversal II

    // 递归版,时间复杂度 O(n),空间复杂度 O(n)
    class Solution {
    public:
    vector<vector<int> > levelOrderBottom(TreeNode *root) { vector<vector<int>> result;
    traverse(root, 1, result);
    std::reverse(result.begin(), result.end()); // 比上一题多此一行 return result;
    }
          void traverse(TreeNode *root, size_t level, vector<vector<int>> &result) {
              if (!root) return;
              if (level > result.size())
                  result.push_back(vector<int>());
              result[level-1].push_back(root->val);
              traverse(root->left, level+1, result);
              traverse(root->right, level+1, result);
    } };

    Binary Tree Zigzag Level Order Traversal

    // 递归版,时间复杂度 O(n),空间复杂度 O(n)
    class Solution {
    public:
          vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
              vector<vector<int>> result;
              traverse(root, 1, result, true);
              return result;
    }
          void traverse(TreeNode *root, size_t level, vector<vector<int>> &result,
                  bool left_to_right) {
              if (!root) return;
              if (level > result.size())
                  result.push_back(vector<int>());
              if (left_to_right)
                  result[level-1].push_back(root->val);
              else
                  result[level-1].insert(result[level-1].begin(), root->val);
              traverse(root->left, level+1, result, !left_to_right);
              traverse(root->right, level+1, result, !left_to_right);
          }
    };
  • 相关阅读:
    iOS9--适配系列教程(原文/译文)
    电梯调度设计思路及算法
    10大高频率单词筛选
    html知识点总结
    关于博客
    Java构造器内部的多态方法
    Java初学者必学的六大Java语言要点
    Java中的length字段和length()方法
    Java学习有方法有捷径
    Java 分隔符函数split的使用注意事项
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7009995.html
Copyright © 2011-2022 走看看