【C++】每日一题 103 二叉树的锯齿形层序遍历

devtools/2024/9/23 23:17:47/

给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

思路:
使用 BFS(广度优先搜索)算法,但在遍历每一层时,根据当前层的奇偶性来决定节点值的输出顺序。

#include <vector>
#include <queue>
#include <iostream>using namespace std;// 二叉树节点结构
struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};class Solution {
public:vector<vector<int>> zigzagLevelOrder(TreeNode* root) {vector<vector<int>> result;if (!root) return result;queue<TreeNode*> q;q.push(root);bool leftToRight = true; // 控制遍历顺序while (!q.empty()) {int size = q.size();vector<int> level(size);for (int i = 0; i < size; ++i) {TreeNode* node = q.front();q.pop();// 根据遍历顺序确定节点值的插入位置int index = leftToRight ? i : size - 1 - i;level[index] = node->val;if (node->left) q.push(node->left);if (node->right) q.push(node->right);}result.push_back(level);leftToRight = !leftToRight; // 切换遍历顺序}return result;}
};// 辅助函数:释放二叉树节点内存
void deleteTree(TreeNode* root) {if (!root) return;deleteTree(root->left);deleteTree(root->right);delete root;
}int main() {// 创建二叉树TreeNode* root = new TreeNode(3);root->left = new TreeNode(9);root->right = new TreeNode(20);root->right->left = new TreeNode(15);root->right->right = new TreeNode(7);// 创建解决方案对象Solution solution;// 获取锯齿形层序遍历结果vector<vector<int>> result = solution.zigzagLevelOrder(root);// 输出结果cout << "Zigzag level order traversal: " << endl;for (const auto& level : result) {for (int val : level) {cout << val << " ";}cout << endl;}// 释放内存deleteTree(root);return 0;
}

这个算法的时间复杂度取决于二叉树的节点数量,假设节点总数为 ( n )。在算法中,我们通过 BFS 遍历了整棵二叉树,每个节点只会被访问一次,因此时间复杂度为 ( O(n) )。

空间复杂度主要由队列和结果数组所占用的空间决定。在最坏情况下,队列中会存储二叉树的所有叶子节点,而二叉树的叶子节点数量最多为 ( n/2 ),因此队列的空间复杂度为 ( O(n) )。此外,结果数组所需的空间与二叉树的高度成正比,最坏情况下为 ( O(log n) )。因此,总的空间复杂度为 ( O(n) )。


http://www.ppmy.cn/devtools/39440.html

相关文章

数据结构之链表篇

今天我们讲我们数据结构的另一个重要的线性结-----链表&#xff0c; 什么是链表 链表是一种在 物理存储上不连续&#xff0c;但是在逻辑结构上通过指针链接下一个节点的形成一个连续的结构。 他和我们的火车相似&#xff0c;我们的元素是可以类比成车厢&#xff0c;需要将⽕…

党务政务服务热线|基于SSM的党务政务服务热线平台(源码+数据库+文档)

目录 基于SprinBootvue的党务政务服务热线平台 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2部门功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; …

学习3D几何和特征一致的高斯溅射目标去除

earning 3D Geometry and Feature Consistent Gaussian Splatting for Object Removal 学习3D几何和特征一致的高斯溅射目标去除 Yuxin Wang 王玉欣 HKUST &Qianyi Wu Monash University &Guofeng Zhang Zhejiang University &Dan Xu HKUST 香港科技大学&吴倩…

【C#】某AGV调度系统源码笔记(九)

调度模拟模型类库 车辆监控类 用于模拟和控制一个移动车辆&#xff0c;可能是一个 AGV&#xff08;自动导向车&#xff09;。包含了车辆的一些属性&#xff0c;例如位置、速度、状态等信息&#xff0c;以及一些方法用于控制车辆的行为&#xff0c;例如启动、停止、移动等。 构造…

PyTorch中的prim操作

文章目录 一、prim是什么&#xff1f;二、常见prim操作 一、prim是什么&#xff1f; 在PyTorch中&#xff0c;prim是表示原始操作&#xff08;primitive operation&#xff09;的一种特殊类型。原始操作是构成PyTorch计算图的基本操作单位&#xff0c;代表了计算图中的节点。 …

Vue 3:定义下一代前端开发标准

Vue.js一直以来都是前端开发者钟爱的框架之一&#xff0c;而随着Vue 3的正式发布&#xff0c;这一爱恋将进一步深化。Vue 3的到来不仅意味着更快、更轻量级的框架&#xff0c;更重要的是&#xff0c;它引入了一系列强大的新特性和改进&#xff0c;为前端开发带来了全新的体验和…

如何用python的Turtle绘画?

目录 一、画一个圆和正方形 二、简单的方式来画一个美女 三、Turtle是一个用于绘制图形的标准库 一、画一个圆和正方形 import turtle# 创建一个图形窗口 window turtle.Screen() window.bgcolor("white")# 创建一个海龟画笔 pen turtle.Turtle() pen.shape(&q…

什么是MVC?什么是SpringMVC?什么是三层架构?

文章目录 应用分层什么是MVC?什么是 SpringMVC&#xff1f;三层架构三层架构和MVC的关系 应用分层 在讲解什么是MVC之前&#xff0c;先来理解一下什么是应用分层。 应用分层是一种软件开发设计思想&#xff0c;将应用程序划分成N个层次&#xff0c;每个层次都分别负责自己的…