当前位置:网站首页>【LeetCode每日一题】——103.二叉树的锯齿形层序遍历
【LeetCode每日一题】——103.二叉树的锯齿形层序遍历
2022-08-02 01:57:00 【IronmanJay】
一【题目类别】
- 二叉树
二【题目难度】
- 中等
三【题目编号】
- 103.二叉树的锯齿形层序遍历
四【题目描述】
- 给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
五【题目示例】
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]示例 2:
输入:root = [1]
输出:[[1]]示例 3:
输入:root = []
输出:[]
六【题目提示】
- 树中节点数目在范围 [0, 2000] 内
- -100 <= Node.val <= 100
七【解题思路】
- 层序遍历肯定使用的是BFS(广度优先搜索)
- 基于这个思路进行层序遍历,对于层序遍历比较简单,直接扫描这一层的元素在队列弹出然后加入到结果数组中即可
- 但是题目要求存储的左右顺序不停的反转,所以设置一个标志位,一开始从左到右存储,然后每存储完一层之后,修改标志位,让其从右到左存储。通过不停的修改标志位来达到左右顺序不同的层序存储
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n为树的节点个数
- 空间复杂度: O ( n ) O(n) O(n),其中 n n n为树的节点个数
九【代码实现】
- Java语言版
package Tree;
import java.util.*;
public class p103_ZigzagOrderTraversalOfBinaryTrees {
int val;
p103_ZigzagOrderTraversalOfBinaryTrees left;
p103_ZigzagOrderTraversalOfBinaryTrees right;
public p103_ZigzagOrderTraversalOfBinaryTrees() {
}
public p103_ZigzagOrderTraversalOfBinaryTrees(int val) {
this.val = val;
}
public p103_ZigzagOrderTraversalOfBinaryTrees(int val, p103_ZigzagOrderTraversalOfBinaryTrees left, p103_ZigzagOrderTraversalOfBinaryTrees right) {
this.val = val;
this.left = left;
this.right = right;
}
public static void main(String[] args) {
p103_ZigzagOrderTraversalOfBinaryTrees root = new p103_ZigzagOrderTraversalOfBinaryTrees(3);
p103_ZigzagOrderTraversalOfBinaryTrees left = new p103_ZigzagOrderTraversalOfBinaryTrees(9);
p103_ZigzagOrderTraversalOfBinaryTrees right = new p103_ZigzagOrderTraversalOfBinaryTrees(20);
p103_ZigzagOrderTraversalOfBinaryTrees right1 = new p103_ZigzagOrderTraversalOfBinaryTrees(15);
p103_ZigzagOrderTraversalOfBinaryTrees right2 = new p103_ZigzagOrderTraversalOfBinaryTrees(7);
root.left = left;
root.right = right;
right.left = right1;
right.right = right2;
List<List<Integer>> res = zigzagLevelOrder(root);
System.out.println("res = " + res);
}
public static List<List<Integer>> zigzagLevelOrder(p103_ZigzagOrderTraversalOfBinaryTrees root) {
List<List<Integer>> res = new LinkedList<List<Integer>>();
boolean flag = true;
if (root == null) {
return res;
}
Queue<p103_ZigzagOrderTraversalOfBinaryTrees> queue = new ArrayDeque<p103_ZigzagOrderTraversalOfBinaryTrees>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
Deque<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < size; i++) {
p103_ZigzagOrderTraversalOfBinaryTrees temp = queue.poll();
if (flag) {
list.offerLast(temp.val);
} else {
list.offerFirst(temp.val);
}
if (temp.left != null) {
queue.offer(temp.left);
}
if (temp.right != null) {
queue.offer(temp.right);
}
}
res.add(new LinkedList<Integer>(list));
if (flag) {
flag = false;
} else {
flag = true;
}
}
return res;
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int** zigzagLevelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes)
{
int** res = (int**)malloc(sizeof(int*) * 2001);
*returnColumnSizes = (int*)malloc(sizeof(int) * 2001);
*returnSize = 0;
struct TreeNode* queue[2001];
int front = 0;
int rear = 0;
bool flag = true;
if (root == NULL)
{
(*returnColumnSizes)[*returnSize] = 0;
return res;
}
queue[rear++] = root;
while (front != rear)
{
res[*returnSize] = (int*)malloc(sizeof(int) * 2001);
(*returnColumnSizes)[*returnSize] = 0;
int size = (rear - front + 2001) % 2001;
int count = 0;
for (int i = 0; i < size; i++)
{
struct TreeNode* temp = queue[front++];
if (flag)
{
res[*returnSize][count] = temp->val;
}
else
{
res[*returnSize][size - count - 1] = temp->val;
}
if (temp->left != NULL)
{
queue[rear++] = temp->left;
}
if (temp->right != NULL)
{
queue[rear++] = temp->right;
}
count++;
}
(*returnColumnSizes)[*returnSize] = count;
*returnSize = *returnSize + 1;
if (flag)
{
flag = false;
}
else
{
flag = true;
}
}
return res;
}
/*主函数省略*/
十【提交结果】
Java语言版
C语言版
边栏推荐
- Hash collisions and consistent hashing
- 3个月测试员自述:4个影响我职业生涯的重要技能
- 『网易实习』周记(一)
- LeetCode刷题日记:34、 在排序数组中查找元素的第一个和最后一个位置
- Newton's theorem and related corollaries
- Handwriting a blogging platform ~ the first day
- 当关注「互联网+」模式的时候,通常仅仅只是在关注「互联网+」模式本身
- The Paddle Open Source Community Quarterly Report is here, everything you want to know is here
- Local storage in Kubernetes
- 【刷题篇】打家劫舍
猜你喜欢
Multi-Party Threshold Private Set Intersection with Sublinear Communication-2021: Interpretation
Fly propeller power space future PIE - Engine Engine build earth science
HSDC和独立生成树相关
Data transfer at the data link layer
typescript35-class的构造函数
雇用WordPress开发人员:4个实用的方法
Analysis of volatile principle
Constructor instance method inheritance of typescript37-class (extends)
typescript33 - high-level overview of typescript
Day115. Shangyitong: Background user management: user lock and unlock, details, authentication list approval
随机推荐
垃圾回收器CMS和G1
Rust P2P网络应用实战-1 P2P网络核心概念及Ping程序
2023年起,这些地区软考成绩低于45分也能拿证
Local storage in Kubernetes
Redis 订阅与 Redis Stream
Day116.尚医通:预约挂号详情 ※
编码经验之谈
S/4中究竟有多少个模块,你对这些模块了解多少
Byte taught me a hard lesson: When a crisis comes, you don't even have time to prepare...
The Paddle Open Source Community Quarterly Report is here, everything you want to know is here
超大规模的产业实用语义分割数据集PSSL与预训练模型开源啦!
kubernetes之服务发现
Shell入门终章
oracle查询扫描全表和走索引
力扣 1374. 生成每种字符都是奇数个的字符串
ofstream,ifstream,fstream读写文件
Navicat data shows incomplete resolution
typescript34-class的基本使用
密码学的基础:X.690和对应的BER CER DER编码
Hash collisions and consistent hashing