LeetCode(103): 二叉树的锯齿形层次遍历 [LeetCode] Binary Tree Level Order Traversal 二叉树层序遍历

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: 

猜你喜欢

转载自www.cnblogs.com/ariel-dreamland/p/9162372.html