【二叉树-BFS系列1】二叉树的右视图、二叉树的锯齿形层次遍历
题目 199. 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-right-side-view
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
- BFS层序遍历, 将每一层最后一个节点加入答案中。
- 需要区分层次时,可以如下代码在while中加入for当层的循环。
- 树的BFS遍历:
根结点入队;
while队列非空:
弹出队首节点,
处理队首节点,
左孩子节点非空则入队,右孩子节点非空则入队。
待做
此题DFS也可解。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> res = new ArrayList<>();
Queue<TreeNode> q = new LinkedList<>();
if(root!=null){
q.offer(root);
}
while(!q.isEmpty()){
int size = q.size();
for(int i=0;i<size;++i){
TreeNode node = q.poll();
if(node.left!=null){
q.offer(node.left);
}
if(node.right!=null){
q.offer(node.right);
}
if(i==size-1){
res.add(node.val);
}
}
}
return res;
}
}
题目 103. 二叉树的锯齿形层次遍历
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
题解
法一:(推荐)
双端队列实现。
注意同一层弹出节点和插入子节点一定是在队列的两端,否则会造成混乱,进而可推出一个节点的左右子节点的具体插入顺序。
奇数层按正常队首出队,左右入队尾。
偶数层则队尾出队,为了保证队中按正常顺序右左孩子入队首。
法二:
用两个栈分别存奇数层和偶数层,很好的利用栈的特性实现之字形遍历。
代码(法一:双端队列)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ansList = new LinkedList<List<Integer>>();
Deque<TreeNode> q = new LinkedList<>();
if(root!=null){
q.addLast(root);
}
boolean rightToLeft=true;
while(!q.isEmpty()){
List<Integer> list = new LinkedList<>();
int size = q.size();//size()会在循环过程中改变
for(int i=0;i<size;++i){//
if(rightToLeft){
TreeNode node = q.pollFirst();//弹出队首
list.add(node.val);
if(node.left!=null){
q.addLast(node.left);//左右节点顺序加入队尾,下次从尾部弹出
}
if(node.right!=null){
q.addLast(node.right);
}
}else{
TreeNode node = q.pollLast();//弹出队尾
list.add(node.val);
if(node.right!=null){//右左节点顺序加入队首,下次从队首弹出
q.addFirst(node.right);
}
if(node.left!=null){
q.addFirst(node.left);
}
}
}
ansList.add(list);
rightToLeft=!rightToLeft;
}
return ansList;
}
}
代码(法二:两个栈实现)
import java.util.ArrayList;
import java.util.Stack;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
int layer=1;
Stack<TreeNode> sOdd=new Stack<>();
Stack<TreeNode> sEven=new Stack<>();
ArrayList<ArrayList<Integer>> ansList=new ArrayList<ArrayList<Integer>>();
if(pRoot==null) {
return ansList;
}
sOdd.push(pRoot);
while(!sOdd.isEmpty()||!sEven.isEmpty()) {
if(layer%2==1) {
ArrayList<Integer> arrList=new ArrayList<>();
while(!sOdd.isEmpty()) {
TreeNode node=sOdd.pop();
if(node!=null) {//
arrList.add(node.val);
sEven.push(node.left);
sEven.push(node.right);
}
}
if(!arrList.isEmpty()) {
ansList.add(arrList);
++layer;
}
}
else {
ArrayList<Integer> arrList=new ArrayList<>();
while(!sEven.isEmpty()) {
TreeNode node=sEven.pop();
if(node!=null) {
arrList.add(node.val);
sOdd.push(node.right);
sOdd.push(node.left);
}
}
if(!arrList.isEmpty()) {
ansList.add(arrList);
++layer;
}
}
}
return ansList;
}
}
【二叉树-BFS系列1】二叉树的右视图、二叉树的锯齿形层次遍历的更多相关文章
- LeetCode:二叉树的锯齿形层次遍历【103】
LeetCode:二叉树的锯齿形层次遍历[103] 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 ...
- LeetCode 二叉树的锯齿形层次遍历
第103题 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7] ...
- [LeetCode] 103. 二叉树的锯齿形层次遍历
题目链接 : https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/ 题目描述: 给定一个二叉树,返回其节 ...
- lintcode二叉树的锯齿形层次遍历 (双端队列)
题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...
- lintcode: 二叉树的锯齿形层次遍历
题目 二叉树的锯齿形层次遍历 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / \ ...
- [Swift]LeetCode103. 二叉树的锯齿形层次遍历 | Binary Tree Zigzag Level Order Traversal
Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...
- LeetCode(103): 二叉树的锯齿形层次遍历
Medium! 题目描述: 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,nul ...
- 二叉树的锯齿形层次遍历 · Binary Tree Zigzag Level Order Traversal
[抄题]: 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) [思维问题]: 不知道反复切换要怎么做:用boolean normalOrder当作布尔型 ...
- LintCode-71.二叉树的锯齿形层次遍历
二叉树的锯齿形层次遍历 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 返回其锯齿形的层次 ...
随机推荐
- win10 + Ubuntu 20.04 LTS 双系统 引导界面美化
版权声明:本文为CSDN博主「ZChen1996」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明. 原文链接:https://blog.csdn.net/ZChen1 ...
- myBatis源码解析-类型转换篇(5)
前言 开始分析Type包前,说明下使用场景.数据构建语句使用PreparedStatement,需要输入的是jdbc类型,但我们一般写的是java类型.同理,数据库结果集返回的是jdbc类型,而我们需 ...
- 带你用 Python 实现自动化群控设备
1. 前言 群控,相信大部分人都不会陌生!印象里是一台电脑控制多台设备完成一系列的操作,更多的人喜欢把它和灰产绑定在一起! 事实上,群控在自动化测试中也被广泛使用!接下来的几篇文章,我将带大家聊聊企业 ...
- C++炮台实验
炮台实验 蒜头君在玩一个战争模拟游戏,他有高度为 1,2,3,... ,n的炮台各一个,他需要把这 n个炮台从左往右排成一行,并且炮口都朝向右边. 在这个游戏中,所有炮台发射的炮弹会摧毁前方所有高度比 ...
- 操作系统-PV操作的原理和几种常见问题
信号量是一种变量类型,用一个记录型数据结构表示,有两个分量:信号量的值和信号量队列指针 除了赋初值外,信号量仅能通过同步原语PV对其进行操作 s.value为正时,此值为封锁进程前对s信号量可施行的P ...
- 第三篇Scrum冲刺博客--Interesting-Corps
第三篇Scrum冲刺博客 站立式会议 1.会议照片 2.队友完成情况 团队成员 昨日完成 今日计划 鲍鱼铭 主页页面跳转社区功能及社区设计及布局实现 搜索页面跳转.设计及布局实现 叶学涛 编写个人页面 ...
- Advances and Open Problems in Federated Learning
挖个大坑,等有空了再回来填.心心念念的大综述呀(吐血三升)! 郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 项目地址:https://github.com/open-intellige ...
- Spring编程式注解使用不当导致其他事务无法正常提交
1.事故背景 原本在使用的是注解式事务,后面因为需要在事务中增加异步推送机制,所以需要将推送机制放到事务之外,修改后发现系统经常出现事务长时间无法提交导致回滚. 2.排查流程 (1)一开始重启应用是能 ...
- 牛客网PAT练兵场-锤子剪刀布
题目地址:https://www.nowcoder.com/questionTerminal/79db907555c24b15a9c73f7f7d0e2471 题解:无 /** * *作者:Ycute ...
- 解决SpringBoot jar包中的文件读取问题
前言 SpringBoot微服务已成为业界主流,从开发到部署都非常省时省力,但是最近小明开发时遇到一个问题:在代码中读取资源文件(比如word文档.导出模版等),本地开发时可以正常读取 ,但是,当我们 ...