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 };
  • 相关阅读:
    自定义的弹出框列表适配器,类似于大众点评或美团
    Android 微信支付&支付宝支付
    动态设置 view 在布局中位置
    android 之图片异步加载
    android 侧滑菜单
    Google 官方 侧滑 drawerlayout
    python D27网络传输协议
    计算机单位换算、以及sort、sorted函数的区别
    python D26 socket、网络整个通信流程
    python D25 包
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4620339.html
Copyright © 2011-2022 走看看