LeetCode - 103. 二叉树的锯齿形层序遍历

2024-05-11 17:48

本文主要是介绍LeetCode - 103. 二叉树的锯齿形层序遍历,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

描述

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

例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回锯齿形层序遍历如下:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/

求解

       // 暴力解法,利用两个栈实现vector<vector<int>> zigzagLevelOrder_vio(TreeNode *root) {if (root == nullptr) {return vector<vector<int>>();}// 利用栈辅助实现,从根节点开始,层序遍历中交换将左右子节点入栈,达到蛇形遍历的目的// 即当前层是左,右子节点入栈,则下层是右,子节点入栈int tag = 0;std::stack<TreeNode *> s1;s1.push(root);std::stack<TreeNode *> s2;vector<vector<int>> res;while (true) {if (tag == 0 && !s1.empty()) {tag = 1;vector<int> rec;rec.reserve(s1.size());while (!s1.empty()) {auto node = s1.top();s1.pop();rec.push_back(node->val);if (node->left) {s2.push(node->left);}if (node->right) {s2.push(node->right);}}res.emplace_back(std::move(rec));} else if (tag == 1 && !s2.empty()) {tag = 0;vector<int> rec;rec.reserve(s2.size());while (!s2.empty()) {auto node = s2.top();s2.pop();rec.push_back(node->val);if (node->right) {s1.push(node->right);}if (node->left) {s1.push(node->left);}}res.emplace_back(std::move(rec));} else {break;}}return res;}// 层序遍历 + 奇数层翻转vector<vector<int>> zigzagLevelOrder(TreeNode *root) {vector<vector<int>> res;if (root == nullptr) {return res;}std::queue<TreeNode *> q;q.push(root);  // 根节点记为偶数层0,依次累加bool isLeftToRight = true;while (!q.empty()) {const int N = q.size();vector<int> record;record.reserve(N);for (int i = 0; i < N; ++i) {auto node = q.front();q.pop();record.push_back(node->val);if (node->left) {q.push(node->left);}if (node->right) {q.push(node->right);}}if (!isLeftToRight) {// 如果是奇数层,翻转结果std::reverse(record.begin(), record.end());}res.emplace_back(std::move(record));isLeftToRight = !isLeftToRight;}return res;}};

 

这篇关于LeetCode - 103. 二叉树的锯齿形层序遍历的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/980232

相关文章

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Java遍历HashMap的6种常见方式

《Java遍历HashMap的6种常见方式》这篇文章主要给大家介绍了关于Java遍历HashMap的6种常见方式,方法包括使用keySet()、entrySet()、forEach()、迭代器以及分别... 目录1,使用 keySet() 遍历键,再通过键获取值2,使用 entrySet() 遍历键值对3,

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return