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);
          }
    };
  • 相关阅读:
    线段拟合(带拉格朗日乘子,HGL)
    工作到位的标准
    Git的简单使用
    位移
    java日期格式化(util包下转成sql包下)
    java中继承的概念
    工作流驳回到指定连线节点上
    年终个人总结
    实现多条件查询 匹配数据库字段中多个数据
    activiti和SSH项目做整合
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7009995.html
Copyright © 2011-2022 走看看