LeetCode 103. 二叉树的锯齿形层次遍历
时间:2022-07-22
本文章向大家介绍LeetCode 103. 二叉树的锯齿形层次遍历,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
103. 二叉树的锯齿形层次遍历
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如: 给定二叉树 [3,9,20,null,null,15,7],
3
/
9 20
/
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
解题
首先这个题是在二叉树的层次遍历的基础上进行的。 可以看一下,我写的这个题解: LeetCode 102. 二叉树的层序遍历
这里就不在啰嗦层次遍历了。
如果你不懂二叉树的遍历可以看: 我是怎么一步一步调试出来二叉树的遍历(超精彩配图),二叉树遍历再也不用愁了
这个矩形的思路其实就是S
形状的
我们可以给每一层都标上一个号。
那我们就从1开始
如果这个层是奇数说明是第一层 如果是偶数说明是第二层
然后层数+1
然后循环执行
当判断是奇数还是偶数的时候执行不同的操作。
如果是奇数,那就把数据使用尾插法插入的list,说白了就是追加数据
如果是偶数,那就吧数据使用头插法插入list
最终就实现了这个题
核心代码:
static public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if(root==null) return lists;
TreeNode treeNode = root;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(treeNode);
int ceng = 1;//记录层次
while(!queue.isEmpty()){
List<Integer> list = new ArrayList<>();
int n = queue.size();
int index =0;
while (n>index){
//出栈
TreeNode node = queue.pop();
//说明是第一层 如果第二层是会ceng+1,说明切换到了第二层
if(ceng%2!=0){
//追加数据,也就是尾插法
list.add(node.val);
//说明是二层
}else{
//头插法
list.add(0,node.val);
}
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
index++;
}
ceng++;//每一层结束都+1
lists.add(list);
}
return lists;
}
所有测试代码:
package tree.二叉树的锯齿形层次遍历;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
class Solution {
public static void main(String[] args) {
TreeNode t1 = new TreeNode(1);
TreeNode t2 = new TreeNode(2);
TreeNode t3 = new TreeNode(3);
TreeNode t4 = new TreeNode(4);
TreeNode t5 = new TreeNode(5);
t1.left=t2;
t1.right=t3;
t2.left=t4;
t2.right=t5;
System.out.println();
System.out.println("层次遍历:");
List<List<Integer>> lists = levelOrder(t1);
System.out.println("结果:"+lists.toString());
System.out.println("遍历结果:");
lists.stream().forEach(li -> {
li.stream().forEach(ll -> {
System.out.print(ll.intValue()+" ");
});
System.out.println();
});
}
static public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
if(root==null) return lists;
TreeNode treeNode = root;
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(treeNode);
int ceng = 1;//记录层次
while(!queue.isEmpty()){
List<Integer> list = new ArrayList<>();
int n = queue.size();
int index =0;
while (n>index){
//出栈
TreeNode node = queue.pop();
//说明是第一层 如果第二层是会ceng+1,说明切换到了第二层
if(ceng%2!=0){
//追加数据,也就是尾插法
list.add(node.val);
//说明是二层
}else{
//头插法
list.add(0,node.val);
}
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
index++;
}
ceng++;//每一层结束都+1
lists.add(list);
}
return lists;
}
}
class TreeNode {
int val;//每个节点存放的数据
TreeNode left;//左节点
TreeNode right;//右节点
TreeNode(int x) { val = x; }
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法