lintcode二叉树的锯齿形层次遍历 (双端队列)

简介:

v题目链接:

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

v二叉树的锯齿形层次遍历 

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

v样例

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

      3
     / \
    9  20
      /  \
     15   7

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

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

v思路:

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

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

v代码实现:

复制代码
/**
 * 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 = 1;//上一层的节点数目
        int curLevelCnt = 0;//下一层节点数目
        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 == 0){//这一层完毕
                vv.push_back(v);
                v.clear();
                levelCnt = curLevelCnt;
                curLevelCnt = 0;
                dir = !dir;
            }
        }
        return vv;
    }
};









本文转自 小眼儿 博客园博客,原文链接:http://www.cnblogs.com/hujunzheng/p/5042170.html,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
人工智能 关系型数据库 分布式数据库
|
2月前
|
人工智能 编解码 Java
Harness Engineering:耗时一周,我是如何将应用的AI Coding率提升至90%的
文章内容基于作者个人技术实践与独立思考,旨在分享经验,仅代表个人观点。
1068 7
|
9月前
|
存储 运维 监控
阿里云加持,《泡姆泡姆》让全球玩家畅享零延迟冒险
通过 SLS、ARMS 与 CMS 的协同运作,《泡姆泡姆》实现了从基础设施到应用逻辑再到用户行为的全栈洞察。这一技术体系不仅支撑了游戏的全球化运营,更为实时互动娱乐场景提供了可复用的技术范式——通过云原生架构的弹性能力、全栈可观测的智能诊断与热更新的持续交付,让技术真正服务于“玩家体验零损耗”的终极目标。
775 92
|
5天前
|
人工智能 安全 测试技术
|
7天前
|
云安全 人工智能 安全
阿里云 Agentic SOC 位居 IDC MarketScape安全运营智能体2026领导者类别
以 Agentic AI 重构安全运营闭环,阿里云云安全在产品能力与市场份额
1199 3
|
8天前
|
缓存 UED 开发者
Codex109天重置23次,明天还要再送一次
Codex近109天完成23次额度重置,7月14日将迎来第24次。Tibo高频响应用户反馈:优化GPT-5.6高消耗问题、补发失效福利、调整重置时间——形成“反馈→回应→修复→补偿”正向闭环,彰显以用户为中心的产品哲学。(239字)
763 12
|
1天前
|
人工智能 运维 数据挖掘
最新版通义千问(Qwen3.8-Max-Preview)功能介绍
2026年7月,阿里云通义千问正式对外开放**Qwen3.8-Max-Preview旗舰预览模型**,作为目前千问系列规格最高、综合性能最强的新一代万亿级AI模型,该模型搭载2.4T超大参数架构,是阿里云首款突破万亿参数的原生多模态旗舰模型,全面覆盖文本、图像、视频、文档多维度处理能力。相较于前代热门Qwen3.7-Max版本,本次预览版实现全方位跨越式升级,在真实工程开发、多智能体长周期任务、全链路办公自动化、海量数据分析等高阶场景中,综合能力已达到全球顶尖模型水准。现阶段该模型已正式开放抢先体验通道,依托阿里云百炼Token Plan、Qoder编码平台、QoderWork办公终端三大专属
1465 0
|
7天前
|
数据采集 机器学习/深度学习 人工智能
田间杂草定位与检测4200张YOLO智慧农业数据集分享
本数据集含4200张真实农田图像,YOLO格式,单类别(杂草)高质量标注,覆盖多作物、多光照、多生长阶段等复杂场景,专为智慧农业杂草检测与智能除草设备研发设计,支持YOLOv5/v8/v10等主流模型训练。
378 94