103.leetcode Binary Tree Zigzag Level Order Traversal(medium)[二叉树 栈]
2016-07-05 21:13
543 查看
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
return its zigzag level order traversal as:
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] ]
具体解题思路:要采用之字形按层次遍历树,这里采用了两个栈来完成,由于遍历的时候是交叉从左到右或者从右到左的顺序,所以这里采用了flag来判断当前是应该按照从左到右还是从右到左的顺序。st1保存的是需要从右到左来遍历下一层的节点,st2保存的是需要从左到右来遍历下一层的节点。因此判断的依据就是当st1和st2都为空时整棵树就遍历完成。
class Solution { public: vector<vector<int>> zigzagLevelOrder(TreeNode* root) { //vector<int> temp; vector<vector<int> > result; if(root == NULL) return result; stack<TreeNode*> st1; stack<TreeNode*> st2; int flag = 0; st1.push(root); while(st1.size()!=0 || st2.size() !=0) { if(flag == 0 && st1.size()>0) { vector<int> temps; while(st1.size()>0) { TreeNode* temp = st1.top(); if(temp->left != NULL) st2.push(temp->left); if(temp->right != NULL) st2.push(temp->right); st1.pop(); temps.push_back(temp->val); } result.push_back(temps); flag = 1; } if(flag == 1 && st2.size()>0) { vector<int> temps; while(st2.size()>0) { TreeNode* temp = st2.top(); if(temp->right != NULL) st1.push(temp->right); if(temp->left != NULL) st1.push(temp->left); st2.pop(); temps.push_back(temp->val); } result.push_back(temps); flag = 0; } } return result; } };
相关文章推荐
- DMA 突发模式
- Redis学习笔记(二)-四种复合数据类型
- Linux命令------------查找(文件、文件中的关键字)
- 吸血鬼数字(JAVA)
- C++面试题( 收集并整理)
- Native.js for Android
- ubuntu目录结构
- 常见问题即解决方案
- [bzoj3979] [WF2012]infiltration
- 【概率DP】BZOJ4318-OSU!
- 符号(void *)何解?符号(void **)又何解??
- web前端基础学习入门篇(三)
- Deferred Lighting (延迟光照) + Light Pre-Pass 实现多光源动态阴影
- sql优化的一些问题
- spark 1.6.0 core源码分析3 Master HA
- ubuntu14.04 php nginx mysql redis phpmyadmin
- hdoj3790 【最短路】
- 华为机试题--1.字符串最后一个单词的长度
- **在Ubuntu系统下Copley CAN-PCI驱动的安转和开机自启动配置**
- Java集合排序(看完秒懂)