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

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

    For example:
    Given binary tree {3,9,20,#,#,15,7},

        3
       / 
      9  20
        /  
       15   7
    

    return its zigzag level order traversal as:

    [
      [3],
      [20,9],
      [15,7]
    ]
    

    思路

    宽搜的变形,在宽搜的基础上加一个栈,用于在偶数行反向输出。

     1      vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
     2         // Note: The Solution object is instantiated only once and is reused by each test case.
     3         vector<vector<int> > result;
     4         if(root == NULL)
     5             return result;
     6         vector<int> tmp;
     7         int type = 1;
     8         TreeNode * tPoint;
     9         stack<int> aStack;
    10         queue<TreeNode*> aQueue1, aQueue2;
    11         aQueue1.push(root);
    12         while(!aQueue1.empty() || !aQueue2.empty()){
    13             tmp.clear();
    14             if(type){
    15                 while(!aQueue1.empty()){
    16                     tPoint = aQueue1.front();
    17                     aQueue1.pop();
    18                     tmp.push_back(tPoint->val);
    19                     if(tPoint->left != NULL)
    20                         aQueue2.push(tPoint->left);
    21                     if(tPoint->right != NULL)
    22                         aQueue2.push(tPoint->right);
    23                 }
    24                 result.push_back(tmp);
    25                 type = (type+1)%2;
    26             }
    27             else{
    28                 while(!aQueue2.empty()){
    29                     tPoint = aQueue2.front();
    30                     aQueue2.pop();
    31                     aStack.push(tPoint->val);
    32                     if(tPoint->left != NULL)
    33                         aQueue1.push(tPoint->left);
    34                     if(tPoint->right != NULL)
    35                         aQueue1.push(tPoint->right);
    36                 }
    37                 while(!aStack.empty()){
    38                     tmp.push_back(aStack.top());
    39                     aStack.pop();
    40                 }
    41                 result.push_back(tmp);
    42                 type = (type+1)%2;
    43             }
    44         }
    45         return result;
    46     }

     第二遍,交替使用两个栈

     1      vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
     2         // Note: The Solution object is instantiated only once and is reused by each test case.
     3         vector<vector<int> > result;
     4         vector<int> tmp;
     5         if(!root)
     6             return result;
     7         stack<TreeNode *> stacks[2];
     8         bool flag = false;
     9         stacks[0].push(root);
    10         while(!stacks[flag].empty() || !stacks[!flag].empty()){
    11             while(!stacks[flag].empty()){
    12                 TreeNode *node = stacks[flag].top();
    13                 stacks[flag].pop();
    14                 tmp.push_back(node->val);
    15                 if(!flag){
    16                     if(node->left)
    17                         stacks[!flag].push(node->left);
    18                     if(node->right)
    19                         stacks[!flag].push(node->right);
    20                 }
    21                 else{
    22                     if(node->right)
    23                         stacks[!flag].push(node->right);
    24                     if(node->left)
    25                         stacks[!flag].push(node->left);
    26                 }
    27             }
    28             result.push_back(tmp);
    29             tmp.clear();
    30             flag = !flag;
    31         }
    32         return result;
    33     }
  • 相关阅读:
    Win7 安装 IIS 7.5 及部署 .NET 程序到 IIS 的内容杂记
    乐嘉,你快回来
    AMD将要嫁他人?
    高精度运算(运算符重载)
    魔数卡牌
    C语言"#","#@"和"##"在宏定义中的使用技巧
    CentOS7下安装FTP服务
    Linux下FTP的安装和登陆
    怎么让FOXMAIL关了以后在右下角自动收取邮件
    在CentOS7上安装ftp服务器用于保存服务端上传的图片。
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3370133.html
Copyright © 2011-2022 走看看