zoukankan      html  css  js  c++  java
  • LeetCode103 二叉树的锯齿形层次遍历

    给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

    其实就是一个栈,对于奇数层先压入左子树,对于偶数层先压入右子树。但是每一层需要先把所有节点都取出来才能开始循环。

     1 /**
     2  * Definition for a binary tree node.
     3  * struct TreeNode {
     4  *     int val;
     5  *     TreeNode *left;
     6  *     TreeNode *right;
     7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     8  * };
     9  */
    10 class Solution {
    11 private:
    12     stack<TreeNode*> s;
    13 public:
    14     vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
    15         if(root==nullptr)
    16             return {};
    17         s.push(root);
    18         int layer=1;
    19         vector<vector<int>> ans;
    20         while(!s.empty()){
    21             int len=s.size();
    22             vector<int> tempans;
    23             queue<TreeNode*> curlayer;
    24             while(len){
    25                 --len;
    26                 curlayer.push(s.top());
    27                 s.pop();
    28             }
    29             while(!curlayer.empty()){
    30                 TreeNode* temp=curlayer.front();
    31                 curlayer.pop();
    32                 tempans.push_back(temp->val);
    33                 if(layer&1==1){
    34                     if(temp->left!=nullptr)
    35                         s.push(temp->left);
    36                     if(temp->right!=nullptr)
    37                         s.push(temp->right);
    38                 }
    39                 else{
    40                     if(temp->right!=nullptr)
    41                         s.push(temp->right);
    42                     if(temp->left!=nullptr)
    43                         s.push(temp->left);
    44                 }
    45             }
    46             ++layer;
    47             ans.push_back(tempans);
    48         }
    49         return ans;
    50     }
    51 };

    看别人的答案很机智,其实直接一个queue按层次存取节点;然后一个每一层用一个deque存储,奇数层就push_back,偶数层就push_front。

     1 class Solution {
     2 public:
     3     vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
     4         vector<vector<int>> res;
     5         
     6         if (root == NULL)   return {};  
     7         queue<TreeNode*> q;     
     8         q.push(root);  
     9 
    10         int level=0;
    11         while (!q.empty()) 
    12         {  
    13             vector<int>temp;                //存放每一层的元素值
    14             int count=q.size();             //队列大小表示当前层数的元素个数
    15             while(count--)                  //count--逐个对该层元素进行处理
    16             {
    17             TreeNode *t=q.front();             q.pop();    
    18             if(level%2 ==0) 
    19             temp.push_back(t->val);
    20             else
    21             temp.insert(temp.begin(),t->val);
    22             if(t->left)     q.push(t->left);
    23             if(t->right)    q.push(t->right);
    24             }
    25 
    26             level++;
    27             res.push_back(temp);           //将当层元素的vector加入res中
    28         }
    29         return res;
    30         }
    31 };
    32 
    33 
    34 
    35 作者:zrita
    36 链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/solution/c-2chong-fang-fa-dfsbfsdi-gui-he-dui-lie-jian-ji-y/
    37 来源:力扣(LeetCode)
    38 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    mycat分表扩展之全局序列(数据库方式)
    mycat分表扩展之按日期(天)分片
    mycat分表扩展之范围约定
    mycat分表扩展之分片枚举
    jdk导入证书链步骤说明
    oracle md5加密函数
    oracle常用(11g)
    oracle 11g 常规sql
    oracle归档日志
    oracle定时任务
  • 原文地址:https://www.cnblogs.com/rookiez/p/13388580.html
Copyright © 2011-2022 走看看