题目 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】二叉树的右视图、二叉树的锯齿形层次遍历的更多相关文章

  1. LeetCode:二叉树的锯齿形层次遍历【103】

    LeetCode:二叉树的锯齿形层次遍历[103] 题目描述 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 ...

  2. LeetCode 二叉树的锯齿形层次遍历

    第103题 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7] ...

  3. [LeetCode] 103. 二叉树的锯齿形层次遍历

    题目链接 : https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal/ 题目描述: 给定一个二叉树,返回其节 ...

  4. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  5. lintcode: 二叉树的锯齿形层次遍历

    题目 二叉树的锯齿形层次遍历 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / \ ...

  6. [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 ...

  7. LeetCode(103): 二叉树的锯齿形层次遍历

    Medium! 题目描述: 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如:给定二叉树 [3,9,20,null,nul ...

  8. 二叉树的锯齿形层次遍历 · Binary Tree Zigzag Level Order Traversal

    [抄题]: 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) [思维问题]: 不知道反复切换要怎么做:用boolean normalOrder当作布尔型 ...

  9. LintCode-71.二叉树的锯齿形层次遍历

    二叉树的锯齿形层次遍历 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 返回其锯齿形的层次 ...

随机推荐

  1. 数据库迁移神器——Flyway

    不知道你有没有遇到过这种场景,一套代码部署在不同的环境中,随着时间的过去,各个环境代码有版本差异,代码层面可以通过不同的版本来控制,但是数据库层面经常容易忘记更新! 前言 比如刚开始环境 A 和环境 ...

  2. gtk.Builder.AddFromFile SIGSEGV.

    可能是由于GTK没有初始化的缘故,在程序开头加上gtk.Init(nil)进行初始化 或者参考我这篇博客就不会出错了

  3. JavaScript中的正则表达式详解

    摘要:javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法. 正则表达式(Regular Expression)是一门简单语言的语法规范,是强大.便捷.高效的文本 ...

  4. Redis设计与实现——独立功能的实现

    发布和订阅 频道的订阅和退订 struct redisServer{ //键是被订阅者频道 ,键是一个链表,记录所有订阅这个频道的客户端 dict *publish_channels } 订阅实现: ...

  5. 经典的 Fork 炸弹解析

    原文出处: saymagic Jaromil 在 2002 年设计了最为精简的一个Linux Fork炸弹,整个代码只有13个字符,在 shell 中运行后几秒后系统就会宕机: ::(){:|:&am ...

  6. JavaScript学习系列博客_6_JavaScript中的算数运算符

    运算符(操作符) 在JS中 +.-.*./.%这些都是算数运算符,typeof也是一个运算符,它的操作结果就是得到一个描述变量数据类型的字符串. + 运算符 1.两个值在都没有string类型的值的情 ...

  7. 痞子衡嵌入式:解锁i.MXRTxxx上FlexSPI模块自带的地址重映射(Remap)功能

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT三位数系列隐藏的FlexSPI Remap功能. 前段时间痞子衡写了一篇文章 <利用i.MXRT1060,1010上新 ...

  8. rcp

    rcp的命令 rcp,远程文件复制.rcp既可以在本地主机和远程主机之间进行文件复制,也可以用于在两个远程主机之间进行文件复制.除了复制文件外,rcp也可以用于目录复制,只需要加参数-r. rcp的命 ...

  9. 牛客网PAT练兵场-程序运行时间

    题解:无(注意下四舍五入和输出格式即可) 题目地址:https://www.nowcoder.com/questionTerminal/fabbb85fc2d342418bcacdf0148b6130 ...

  10. 求求大厂给个Offer:Map面试题

    前言 文本已收录至我的GitHub:https://github.com/ZhongFuCheng3y/3y,有300多篇原创文章,最近在连载面试系列! 我,三歪,最近开始写面试系列.我给这个面试系列 ...