18959 二叉树的之字形遍历

news2024/9/27 4:49:30

### 思路

1. **输入读取**:
   - 读取输入字符串,表示完全二叉树的顺序存储结构。

2. **构建二叉树**:
   - 使用队列构建二叉树,按层次顺序插入节点。

3. **之字形层序遍历**:
   - 使用双端队列进行层序遍历,交替从左到右和从右到左。

4. **输出结果**:
   - 按层输出节点值。

### 伪代码

1. 读取输入字符串 `input`。
2. 定义 `TreeNode` 结构体,包含 `val`,`left` 和 `right`。
3. 构建二叉树:
   - 初始化队列 `q`。
   - 创建根节点并入队。
   - 遍历 `input`,按层次顺序插入节点。
4. 之字形层序遍历:
   - 初始化双端队列 `dq`。
   - 初始化结果列表 `result`。
   - 使用标志变量 `left_to_right` 控制遍历方向。
   - 遍历每一层节点,按 `left_to_right` 方向插入 `dq`。
   - 将 `dq` 中的节点值加入 `result`。
5. 输出 `result`。

### C++代码

#include <iostream>
#include <vector>
#include <deque>
#include <queue>

struct TreeNode {
    char val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};

TreeNode* buildTree(const std::string& input) {
    if (input.empty() || input[0] == '#') return nullptr;
    TreeNode* root = new TreeNode(input[0]);
    std::queue<TreeNode*> q;
    q.push(root);
    int i = 1;
    while (!q.empty() && i < input.size()) {
        TreeNode* node = q.front();
        q.pop();
        if (input[i] != '#') {
            node->left = new TreeNode(input[i]);
            q.push(node->left);
        }
        i++;
        if (i < input.size() && input[i] != '#') {
            node->right = new TreeNode(input[i]);
            q.push(node->right);
        }
        i++;
    }
    return root;
}

void zigzagLevelOrder(TreeNode* root) {
    if (!root) return;
    std::deque<TreeNode*> dq;
    dq.push_back(root);
    bool left_to_right = true;
    while (!dq.empty()) {
        int size = dq.size();
        std::vector<char> level;
        for (int i = 0; i < size; ++i) {
            if (left_to_right) {
                TreeNode* node = dq.front();
                dq.pop_front();
                level.push_back(node->val);
                if (node->left) dq.push_back(node->left);
                if (node->right) dq.push_back(node->right);
            } else {
                TreeNode* node = dq.back();
                dq.pop_back();
                level.push_back(node->val);
                if (node->right) dq.push_front(node->right);
                if (node->left) dq.push_front(node->left);
            }
        }
        for (char c : level) {
            std::cout << c << " ";
        }
        std::cout << std::endl;
        left_to_right = !left_to_right;
    }
}

int main() {
    std::string input;
    std::cin >> input;
    TreeNode* root = buildTree(input);
    zigzagLevelOrder(root);
    return 0;
}


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2088621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为何要引入服务注册组件及组件对比

我的后端学习大纲 SpringCloud学习大纲 1.为什么要引入服务注册中心&#xff1a; 1.1.原因说明 1.微服务所在的IP地址和端口号硬编码到订单微服务中&#xff0c;属于硬编码&#xff0c;会存在非常多的问题 如果订单微服务和支付微服务的IP地址或者端口号发生了变化&#xff…

idea配置FTP文件上传

idea配置FTP 连接测试 打开 工具拦打开 maven依赖 <!-- FTP --> <dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><version>3.8.0</version> </dependency>FTP-配置 /*** FTP-配置*/ …

数字时代的内容安全治理:审核与管理的艺术

《互联网内容审核与信息安全管理》提供了全面实施互联网内容审核与信息安全管理的方法&#xff0c;主要包括三部分内容。 第一部分&#xff1a;阐释什么是互联网内容审核与信息安全管理&#xff0c;为什么要进行互联网内容审核与信息安全管理&#xff1b;重点分析互联网内容…

vs 项目.gitignore设置过滤某个文件夹无效

问题描述 项目使用tfs进行管理&#xff0c;在使用uniapp开发小程序的时候&#xff0c;每次vs中的更改都会出现99的更改&#xff0c;查看详情发现都是uniapp下面的unpackage文件夹下面的内容。原因是每次重新运行该下面的文件都会重新生成。后来在该项目下面的.gitignore中配置…

【Vue】Echart渲染数据时页面不显示内容

背景 做的一个对话交互的功能&#xff0c;根据后台返回的数据&#xff0c;渲染成Echart图表展示因为图表种类多&#xff0c;因此根据不同图表单独做了一个个vue组件&#xff0c;将数据根据展示类型传到这些子组件中进行渲染无论哪种图表&#xff0c;第一次展示时都能正常展示&…

2024实战指南:四款全免费的数据恢复工具盘点!

在这个数字化的时代里&#xff0c;数据的安全至关重要。如果一不小心删除或丢失了重要数据应该怎么办呢&#xff1f;这几个全免费的数据恢复工具可以帮你解决问题&#xff0c;亲测好用哦&#xff01; 第一款&#xff1a;福昕数据恢复 直达链接&#xff1a;www.pdf365.cn/foxi…

跨系统备忘录迁移有哪些方法?备忘录内容如何跨平台转移?

备忘录作为我们日常生活中常用的软件&#xff0c;帮助我们随时记录重要事项和灵感。然而&#xff0c;随着科技的发展&#xff0c;我们可能会更换不同系统的设备&#xff0c;这时就需要将备忘录内容进行迁移。特别是跨系统的迁移&#xff0c;往往让人感到不便。那么&#xff0c;…

探索挪车小程序源码开发:构建便捷社区生活的智慧桥梁

随着城市化进程的加速&#xff0c;车辆保有量不断增加&#xff0c;停车难、挪车难成为了许多城市居民日常生活中的一大痛点。为了解决这一难题&#xff0c;挪车小程序应运而生&#xff0c;它利用移动互联网的便捷性&#xff0c;为车主之间搭建起一个高效、便捷的沟通平台。本文…

【Python 千题 —— 基础篇】身份证隐藏的信息

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 在一个用户信息管理系统中,你需要处理和验证用户提供的身份证号。编写一个程序来从用户信息字符串中提取和验证身份证号,并提供相应的处理方式…

LLM论文研读: MindSearch

1. 背景 近日中科大与上海人工智能实验室联合推出的MindSearch思索&#xff0c;引起了不小的关注&#xff0c;github上的星标&#xff0c;短短几周时间&#xff0c;已经飙到了4.2K。看来确实有些内容&#xff0c;因此本qiang~研读了论文及代码&#xff0c;针对其中的原理与创新…

自动化测试的使用场景有哪些?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 本文将通过介绍 自动化测试是什么&#xff1f;哪些场景适用于自动化测试&#xff1f;自动化测试的好处&#xff1f;以及通过 具体的自动化测试工具应用实例来对自动…

【逐行注释】无迹卡尔曼滤波(UKF)的MATLAB代码,附下载链接

文章目录 程序组成部分部分代码及注释展示运行结果主要模块解读&#xff1a;运动模型绘图部分误差统计特性输出 下载链接 程序组成部分 由模型初始化、运动模型、UKF主体部分、绘图代码和输出部分组成&#xff1a; 部分代码及注释展示 运行结果 运行后可以得到三幅图和一段…

uniapp小程序怎么判断滑动的方向

项目场景&#xff1a; 获取手机上手指滑动的距离超过一定距离 来操作一些逻辑 解决方案&#xff1a; 在uniapp中&#xff0c;可以通过监听触摸事件来判断滑动的方向。常用的触摸事件包括touchstart, touchmove, 和 touchend。通过这些事件的参数&#xff0c;可以计算出用户的滑…

Java 入门指南:Java NIO —— Selector(选择器)

NIO 的引入 在传统的 Java I/O 模型&#xff08;BIO&#xff09;中&#xff0c;I/O 操作是以阻塞的方式进行的。当一个线程执行一个 I/O 操作时&#xff0c;它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈&#xff0c;因为需要为每个连接创建一…

随身wifi靠谱吗?适合哪类人使用?靠谱随身wifi怎么选?热门随身wifi推荐测评!

你真的适合用随身wifi吗&#xff1f; 户外工作者&#xff1a;外卖员&#xff0c;滴滴司机&#xff0c;卡车司机&#xff0c;户外直播等人群对于网络的稳定性和流量的需求还是比较高的。随身wifi便携&#xff0c;信号稳定&#xff0c;流量多性价比高的特点符合户外工作者对网络的…

制造企业看过来!这15款工程软件值得推荐!

本文将盘点15款工程软件&#xff0c;供企业选型参考。 工程软件就如同工程领域的得力助手&#xff0c;能让工程建设的各个环节都变得更加高效、精准。 对于工程企业来说&#xff0c;如果没有合适的工程软件&#xff0c;就像工匠没有趁手的工具&#xff0c;难以打造出精良的作品…

vmware典型安装centos

创建虚拟机 选择centos镜像 设置用户名

Oracle 网络安全产品安全认证检索

自2023年7月1日起&#xff0c;国家网信办、工业和信息化部、公安部、国家认证认可监督管理委员会统一公布和更新网络关键设备和网络安全专用产品清单。列入《网络关键设备和网络安全专用产品目录》的网络安全专用产品应当按照《信息安全技术网络安全专用产品安全技术要求》等相…

日本对COBOL的需求--一篇说清楚

关于COBOL&#xff08;Common Business-Oriented Language&#xff09;在中国和日本的使用情况&#xff0c;确实存在显著的差异。 在中国&#xff0c;COBOL被视为一种较早的编程语言&#xff0c;其使用范围和需求已经相对较小&#xff0c;这主要是由于技术更新和新一代编程语言…

【微信小程序入门】1、初识微信小程序

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…