leetcode_c++:栈:Binary Tree Zigzag Level Order Traversal(103)
来源:互联网 发布:xp极限编程 编辑:程序博客网 时间:2024/05/16 09:31
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,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
//求层次遍历,但是奇数层要是反着的输出
http://www.acmerblog.com/leetcode-solution-binary-tree-zigzag-level-order-traversal-6239.html
//广度优先遍历,用一个bool记录是从左到右还是从右到左,每一层结束就翻转一下。
// 迭代版,时间复杂度O(n),空间复杂度O(n)
#include <iostream>#include <vector>#include<cmath>#include <algorithm>#include <stack>#include <string>#include <sstream>#include <queue>using namespace std;struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x),left(NULL),right(NULL){}};//LeetCode, Binary Tree Zigzag Level Order Traversal//广度优先遍历,用一个bool记录是从左到右还是从右到左,每一层结束就翻转一下。// 迭代版,时间复杂度O(n),空间复杂度O(n)class Solution {public: vector<vector<int> > zigzagLevelOrder(TreeNode *root) { vector<vector<int> > result; if (nullptr == root) return result; queue<TreeNode*> q; bool left_to_right = true; //left to right vector<int> level; // one level's elements q.push(root); q.push(nullptr); // level separator while (!q.empty()) { TreeNode *cur = q.front(); q.pop(); if (cur) { level.push_back(cur->val); if (cur->left) q.push(cur->left); if (cur->right) q.push(cur->right); } else { if (left_to_right) { result.push_back(level); } else { reverse(level.begin(), level.end()); result.push_back(level); } level.clear(); left_to_right = !left_to_right; if (q.size() > 0) q.push(nullptr); } } return result; }};TreeNode* CreateTree(int a[],int n){ if(n<=0) return NULL; TreeNode** tree=new TreeNode*[n]; for(int i=0;i<n;i++){ if(a[i]==0){ tree[i]=NULL; continue; } tree[i]=new TreeNode(a[i]); } int pos=1; for(int i=0;i<n && pos<n;i++){ if(tree[i]){ tree[i]->left=tree[pos++]; if(pos<n){ tree[i]->right=tree[pos++]; } } } return tree[0];}void printTree_level_order(TreeNode* root){ queue<TreeNode*> q; q.push(root); while(q.size()>0){ TreeNode* n=q.front(); q.pop(); if(n==NULL){ cout<<"# "; continue; } cout<<n->val<<" "; q.push(n->left); q.push(n->right); } cout<<endl;}int printMatrix(vector<vector<int> > &vv){ for(int i=0;i<vv.size();i++){ cout<<"["; for(int j=0;j<vv[i].size();j++) cout<<" "<<vv[i][j]; cout<<"]"<<endl; }}int main(int argc,char** argv){ Solution st; TreeNode* p; vector<vector<int> > vv; int a[]={3,9,20,0,0,15,7}; p=CreateTree(a,sizeof(a)/sizeof(int)); printTree_level_order(p); vv=st.zigzagLevelOrder(p); printMatrix(vv); cout<<endl;}
递归版本
// LeetCode, Binary Tree Zigzag Level Order Traversal// 递归版,时间复杂度O(n),空间复杂度O(n)class Solution {public: vector<vector<int> > zigzagLevelOrder(TreeNode *root) { vector<vector<int>> result; traverse(root, 1, result, true); return result; } void traverse(TreeNode *root, size_t level, vector<vector<int>> &result, bool left_to_right) { if (!root) return; if (level > result.size()) result.push_back(vector<int>()); if (left_to_right) result[level-1].push_back(root->val); else result[level-1].insert(result[level-1].begin(), root->val); traverse(root->left, level+1, result, !left_to_right); traverse(root->right, level+1, result, !left_to_right); }};
0 0
- leetcode_c++:栈:Binary Tree Zigzag Level Order Traversal(103)
- 103 Binary Tree Zigzag Level Order Traversal
- 103-Binary Tree Zigzag Level Order Traversal
- 103:Binary Tree Zigzag Level Order Traversal【树】【BFS】【栈】
- 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
- Binary Tree Zigzag Level Order Traversal
- 【leetcode】Binary Tree Zigzag Level Order Traversal
- [LeetCode]Binary Tree Zigzag Level Order Traversal
- Binary Tree Zigzag Level Order Traversal
- Binary Tree Zigzag Level Order Traversal
- [Leetcode]Binary Tree Zigzag Level Order Traversal
- 设计模式
- 【设计模式】装饰者模式
- 搭建web项目结合spring+cxf的webservice服务
- jquery小知识——ajax
- android打包报错"about_check_update" is not translated in en
- leetcode_c++:栈:Binary Tree Zigzag Level Order Traversal(103)
- 多校联赛第二场
- android 黑名单 短信拦截
- Ubuntu 查看CPU/GPU内存使用情况
- hibernate批量删除与更新
- 设计模式_观察者模式
- Scala学习日志(二)——深入模式匹配(一)
- 日历控件的封装
- html5-contentEditable在线编辑