【二叉树-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}, 返回其锯齿形的层次 ...
随机推荐
- 数据库迁移神器——Flyway
不知道你有没有遇到过这种场景,一套代码部署在不同的环境中,随着时间的过去,各个环境代码有版本差异,代码层面可以通过不同的版本来控制,但是数据库层面经常容易忘记更新! 前言 比如刚开始环境 A 和环境 ...
- gtk.Builder.AddFromFile SIGSEGV.
可能是由于GTK没有初始化的缘故,在程序开头加上gtk.Init(nil)进行初始化 或者参考我这篇博客就不会出错了
- JavaScript中的正则表达式详解
摘要:javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法. 正则表达式(Regular Expression)是一门简单语言的语法规范,是强大.便捷.高效的文本 ...
- Redis设计与实现——独立功能的实现
发布和订阅 频道的订阅和退订 struct redisServer{ //键是被订阅者频道 ,键是一个链表,记录所有订阅这个频道的客户端 dict *publish_channels } 订阅实现: ...
- 经典的 Fork 炸弹解析
原文出处: saymagic Jaromil 在 2002 年设计了最为精简的一个Linux Fork炸弹,整个代码只有13个字符,在 shell 中运行后几秒后系统就会宕机: ::(){:|:&am ...
- JavaScript学习系列博客_6_JavaScript中的算数运算符
运算符(操作符) 在JS中 +.-.*./.%这些都是算数运算符,typeof也是一个运算符,它的操作结果就是得到一个描述变量数据类型的字符串. + 运算符 1.两个值在都没有string类型的值的情 ...
- 痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能. 前段时间痞子衡写了一篇文章 <利用i.MXRT1060,1010上新 ...
- rcp
rcp的命令 rcp,远程文件复制.rcp既可以在本地主机和远程主机之间进行文件复制,也可以用于在两个远程主机之间进行文件复制.除了复制文件外,rcp也可以用于目录复制,只需要加参数-r. rcp的命 ...
- 牛客网PAT练兵场-程序运行时间
题解:无(注意下四舍五入和输出格式即可) 题目地址:https://www.nowcoder.com/questionTerminal/fabbb85fc2d342418bcacdf0148b6130 ...
- 求求大厂给个Offer:Map面试题
前言 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创文章,最近在连载面试系列! 我,三歪,最近开始写面试系列.我给这个面试系列 ...