zoukankan      html  css  js  c++  java
  • [LeetCode] Binary Tree Zigzag Level Order Traversal

    To be honest, I do not know whether this problem is designed to let you use stacks. Anyway, I don't. Here are my codes, both BFS and DFS version.

     1     // BFS 
     2     vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
     3         vector<vector<int> > levels;
     4         if (!root) return levels;
     5         queue<TreeNode*> toVisit;
     6         toVisit.push(root);
     7         int curLevelNodes = 1;
     8         bool flag = false;
     9         while (!toVisit.empty()) {
    10             vector<int> level;
    11             for (int i = 0; i < curLevelNodes; i++) {
    12                 TreeNode* node = toVisit.front();
    13                 toVisit.pop();
    14                 level.push_back(node -> val);
    15                 if (node -> left) toVisit.push(node -> left);
    16                 if (node -> right) toVisit.push(node -> right);
    17             }
    18             if (flag) {
    19                 reverse(level.begin(), level.end());
    20                 flag = false;
    21             }
    22             else flag = true;
    23             levels.push_back(level);
    24             curLevelNodes = toVisit.size();
    25         }
    26         return levels;
    27     }
    28 
    29     // DFS
    30     void dfs(TreeNode* node, int curLevel, bool& nextLevel, vector<int>& level) {
    31         if (!node) return;
    32         if (curLevel == 1) {
    33             level.push_back(node -> val);
    34             if (node -> left || node -> right) nextLevel = true;
    35         }
    36         else {
    37             dfs(node -> left, curLevel - 1, nextLevel, level);
    38             dfs(node -> right, curLevel - 1, nextLevel, level);
    39         }
    40     }
    41     vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
    42         vector<vector<int> > levels;
    43         if (!root) return levels;
    44         int curLevel = 1;
    45         bool nextLevel = true, flag = false;
    46         while (nextLevel) {
    47             nextLevel = false;
    48             vector<int> level;
    49             dfs(root, curLevel++, nextLevel, level);
    50             if (flag) {
    51                 reverse(level.begin(), level.end());
    52                 flag = false;
    53             } 
    54             else flag = true;
    55             levels.push_back(level);
    56         }
    57         return levels;
    58     }

    Update

    Thanks to the remind of ljdsoft1, I have rewritten the code to traverse the nodes in ziazag-order instead of simply reversing it. The code is as follows, using two stacks.

     1 class Solution { 
     2 public:
     3     vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
     4         vector<vector<int> > levels;
     5         if (!root) return levels;
     6         stack<TreeNode*> curLevel, nextLevel;
     7         curLevel.push(root);
     8         bool reversed = false;
     9         while (!curLevel.empty()) { 
    10             vector<int> level;
    11             while (!curLevel.empty()) {
    12                 TreeNode* node = curLevel.top();
    13                 curLevel.pop();
    14                 level.push_back(node -> val);
    15                 if (reversed) {
    16                     if (node -> right) nextLevel.push(node -> right);
    17                     if (node -> left) nextLevel.push(node -> left);
    18                 }
    19                 else {
    20                     if (node -> left) nextLevel.push(node -> left);
    21                     if (node -> right) nextLevel.push(node -> right);
    22                 }
    23             }
    24             levels.push_back(level);
    25             swap(curLevel, nextLevel);
    26             reversed = !reversed; 
    27         }
    28         return levels;
    29     }
    30 };
  • 相关阅读:
    laravel 验证码手机与提交手机的验证?
    微信公众平台开发——微信授权登录(OAuth2.0)
    个人网站可以申请微信授权登录吗
    个人网站可以申请微信授权登录吗?
    个体户微信公众号认证怎么做?无公章
    [微信开发] 没有组织机构代码证、公章怎么认证微信公众号?
    mysql中int、bigint、smallint 和 tinyint的区别详细介绍
    laravel5.6 QQ 第三方登录
    如何给网站的链接设置为绝对地址原文链接
    ArcGIS中文件共享锁定数据溢出 这个方法不行,建议用gdb,不要用mdb
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4620339.html
Copyright © 2011-2022 走看看