zoukankan      html  css  js  c++  java
  • LeetCode(103): 二叉树的锯齿形层次遍历

    Medium!

    题目描述:

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

    例如:
    给定二叉树 [3,9,20,null,null,15,7],

        3
       / 
      9  20
        /  
       15   7
    

    返回锯齿形层次遍历如下:

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

    解题思路:

    这道二叉树的之字形层序遍历是之前那道[LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历的变形,不同之处在于一行是从左到右遍历,下一行是从右往左遍历,交叉往返的之字形的层序遍历。根据其特点,我们想到也有后进先出的特点,这道题我们维护两个栈,相邻两行分别存到两个栈中,进栈的顺序也不相同,一个栈是先进左子结点然后右子节点,另一个栈是先进右子节点然后左子结点,这样出栈的顺序就是我们想要的之字形了。

    C++解法一:

     1 /**
     2  * Definition for binary tree
     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 public:
    12     vector<vector<int> > zigzagLevelOrder(TreeNode *root) {
    13         vector<vector<int> >res;
    14         if (!root) return res;
    15         stack<TreeNode*> s1;
    16         stack<TreeNode*> s2;
    17         s1.push(root);
    18         vector<int> out;
    19         while (!s1.empty() || !s2.empty()) {
    20             while (!s1.empty()) {
    21                 TreeNode *cur = s1.top();
    22                 s1.pop();
    23                 out.push_back(cur->val);
    24                 if (cur->left) s2.push(cur->left);
    25                 if (cur->right) s2.push(cur->right);
    26             } 
    27             if (!out.empty()) res.push_back(out);
    28             out.clear();
    29             while (!s2.empty()) {
    30                 TreeNode *cur = s2.top();
    31                 s2.pop();
    32                 out.push_back(cur->val);
    33                 if (cur->right) s1.push(cur->right);
    34                 if (cur->left) s1.push(cur->left);
    35             }
    36             if (!out.empty()) res.push_back(out);
    37             out.clear();
    38         }
    39         return res;
    40     }
    41 };

    比如对于题干中的那个例子:

        3
       / 
      9  20
        /  
       15   7

    我们来看每一层两个栈s1, s2的情况:

    s1:  3

    s2:

     

    s1:  

    s2:  9  20

     

    s1:  7  15

    s2: 

  • 相关阅读:
    robotframework之配置文件和资源文件
    robotframework-ride创建测试用例过程
    Robot Framework的环境搭建
    Robot Framework的初始化与清除
    robotframework的安装1
    《这么慢,那么美》摘录
    小白摸索记(一)
    学习笔记-express路径问题
    学习笔记-使用cmd命令行创建nodejs项目
    学习笔记
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9162372.html
Copyright © 2011-2022 走看看