• [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 };
  • 相关阅读:
    Jaba_Web--JDBC 修改记录操作模板
    Jaba_Web--JDBC 查询记录操作模板
    Jaba_Web--JDBC 删除记录操作模板
    Java_Web--JDBC 增加记录操作模板
    C语言编程入门题目--No.15
    C语言编程入门题目--No.13
    C语言编程入门题目--No.14
    C语言编程入门题目--No.12
    C语言编程入门题目--No.10
    C语言编程入门题目--No.11
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4620339.html
Copyright © 2020-2023  润新知