题目链接:

  http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/

二叉树的锯齿形层次遍历

  给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行)

样例

  给出一棵二叉树 {3,9,20,#,#,15,7},

      3
   / \
   9 20
   / \
   15 7

  返回其锯齿形的层次遍历为:

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

思路:

  我们用双端队列模拟一下这个过程:开始的时候是正向遍历,3通过push_front()放入队列Q, 形成Q[3]。接着我们规定正向遍历的时候从队列前端去元素,下一层元素放入队列的时候是放入队列的后端;而反向遍历的时候正好相反,唯一不同的就是反向遍历时,下一层的右孩子结点(如果有)先放入队列的前端。

  开始Q[3](从前端取数字), 然后下一层放入后是Q[9,20](从后端去数字),20的下一层放入后是Q[15,7,9], 然后变成Q[15,7](从前端去数字),最后得到遍历的结果。

代码实现:

/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/ class Solution {
/**
* @param root: The root of binary tree.
* @return: A list of lists of integer include
* the zigzag level order traversal of its nodes' values
*/
public:
vector<vector<int>> zigzagLevelOrder(TreeNode *root) {
// write your code here
vector<vector<int>> vv;
if(root == NULL) return vv;
deque<TreeNode *> q;
q.push_back(root);
bool dir = true;//true表示从左向右存储层次遍历,否则是从右向左
int levelCnt = ;//上一层的节点数目
int curLevelCnt = ;//下一层节点数目
vector<int> v;
while(!q.empty()){
TreeNode *cur;
if(dir){
cur = q.front();
q.pop_front();
} else {
cur = q.back();
q.pop_back();
}
if(dir){
if(cur->left){
q.push_back(cur->left);
++curLevelCnt;
}
if(cur->right){
q.push_back(cur->right);
++curLevelCnt;
}
} else {
if(cur->right){
q.push_front(cur->right);
++curLevelCnt;
}
if(cur->left){
q.push_front(cur->left);
++curLevelCnt;
}
}
v.push_back(cur->val);
--levelCnt;
if(levelCnt == ){//这一层完毕
vv.push_back(v);
v.clear();
levelCnt = curLevelCnt;
curLevelCnt = ;
dir = !dir;
}
}
return vv;
}
};

最新文章

  1. iOS中assign、copy 、retain等关键字的含义
  2. 管理系统-------------SSH框架书写登录和显示用户
  3. GDI+系列
  4. C# 常用加密处理
  5. 高可用工具keepalived学习笔记
  6. python &amp; pandas链接mysql数据库
  7. REST API 基于ACCESS TOKEN 的权限解决方案
  8. VB.NET版机房收费系统---七仙女之系统登录
  9. 努比亚 Z5 mini刷机包 omni4.4.2改动V4.0 自用版 精简 MIUI特效
  10. QQ登录界面
  11. swift学习 - tableView自适应高度2(SnapKit Layout)
  12. 直接调用VS.net2005中的配置界面
  13. mybatis常用配置
  14. 99%的Linux运维工程师必须要掌握的命令及运用
  15. struts建立工程helloworld
  16. 基于vue.js实现远程请求json的select控件
  17. 《Linux内核设计与实现》Chapter 1 读书笔记
  18. keepAlive参数详解
  19. p2 休眠模式
  20. jqgrid动态填充select

热门文章

  1. mycat入门教程
  2. php中echo(),print(),print_r(),var_dump()间的区别
  3. zookeeper在linux下自启动
  4. javascript 创建对象的7种模式
  5. *POJ1830 高斯消元
  6. 电容参数:X5R,X7R,Y5V,COG 详解
  7. 简单正则匹配QQ邮箱
  8. android——相对布局,表格布局
  9. linux下打包zip文件
  10. Visual Studio 2015 CTP6 发布