[leetcode] 103. Binary Tree Zigzag Level Order Traversal 解题报告
来源:互联网 发布:苹果笔记本开淘宝店 编辑:程序博客网 时间:2024/05/29 19:56
题目链接:https://leetcode.com/problems/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]]
思路:可以用两个栈来分别保存奇数层和偶数层的结点,奇数层是从左到右,偶数层是从右到左。按照栈的后入先出的特性,在将结点加入到奇数层的栈的时候应该用右向左加,即先入栈根的右结点,再入栈根的左节点,这样计数层出栈的时候就会按照从左到右的顺序出栈。保存偶数层栈的顺序正好相反。
代码如下:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { if(!root) return result; st1.push(root); while(!st1.empty()) { vector<int> tem; while(!st1.empty())//奇数层 { TreeNode* node = st1.top(); tem.push_back(node->val); st1.pop(); if(node->left) st2.push(node->left); if(node->right) st2.push(node->right); } result.push_back(tem); tem.clear(); while(!st2.empty())//偶数层 { TreeNode* node = st2.top(); tem.push_back(node->val); st2.pop(); if(node->right) st1.push(node->right); if(node->left) st1.push(node->left); } if(tem.size() != 0) result.push_back(tem); } return result; }private: vector<vector<int>> result; stack<TreeNode*> st1; stack<TreeNode*> st2;};
还有一种时间复杂度O(n^2)的解法, 就是队列层次遍历, 然后看当前是奇数层还是偶数层, 如果是奇数层就正向加到数组中, 如果是偶数层就加到数组头部. 简单粗暴.
代码如下:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { if(!root) return {}; queue<pair<TreeNode*, int>> que; que.push(make_pair(root, 1)); vector<vector<int>> result; vector<int> vec; while(!que.empty()) { auto val = que.front(); que.pop(); if(val.first->left) que.push(make_pair(val.first->left, val.second+1)); if(val.first->right) que.push(make_pair(val.first->right, val.second+1)); if(val.second%2 == 1) vec.push_back(val.first->val); else vec.insert(vec.begin(), val.first->val); if(que.empty() || val.second != que.front().second) { result.push_back(vec); vec.clear(); } } return result; }};
0 0
- [leetcode] 103. Binary Tree Zigzag Level Order Traversal 解题报告
- 【LeetCode】103. Binary Tree Zigzag Level Order Traversal 解题报告
- [Leetcode] 103. Binary Tree Zigzag Level Order Traversal 解题报告
- 【LeetCode】 Binary Tree Zigzag Level Order Traversal 解题报告
- LeetCode(103) Binary Tree Zigzag Level Order Traversal解题报告
- Leetcode 103. Binary Tree Zigzag Level Order Traversal 二叉树Zigzag遍历 解题报告
- [leetcode]103. Binary Tree Zigzag Level Order Traversal@Java解题报告
- leecode 解题总结:103. Binary Tree Zigzag Level Order Traversal
- LeetCode: Binary Tree Zigzag Level Order Traversal
- [LeetCode]Binary Tree Zigzag Level Order Traversal
- LeetCode Binary Tree Zigzag Level Order Traversal
- [Leetcode] Binary Tree Zigzag Level Order Traversal
- Leetcode: Binary Tree Zigzag Level Order Traversal
- LeetCode Binary Tree Zigzag Level Order Traversal
- [LeetCode] Binary Tree Zigzag Level Order Traversal
- [Leetcode] Binary Tree Zigzag Level Order Traversal
- 【leetcode】Binary Tree Zigzag Level Order Traversal
- [LeetCode]Binary Tree Zigzag Level Order Traversal
- jeesite框架搭建 (mysql数据库)
- zend中function的声明
- C++基本内置类型详解
- 二次型(Quadratic Form)
- [R] R functions to deal with regular expression
- [leetcode] 103. Binary Tree Zigzag Level Order Traversal 解题报告
- git 使用
- 流体力学方程的秘密(1)
- 长文章分页代码,页码可以随鼠标移动和当前所在页码变色
- [leetcode] 94. Binary Tree Inorder Traversal 解题报告
- HTTP安全验证机制和Spring Security
- What happens when you visit a website? What exactly goes on after you type a URL into a browser?
- [leetcode] 114. Flatten Binary Tree to Linked List 解题报告
- 黑马程序员——正则表达式的总结及案例