首页 > 其他分享 >二叉树的层次遍历

二叉树的层次遍历

时间:2023-02-04 11:36:18浏览次数:35  
标签:遍历 TreeNode 层次 temp queue right 二叉树 null root


文章目录

  • ​​二叉树的层次遍历​​
  • ​​二叉树的层次遍历​​
  • ​​107. 二叉树的层序遍历 II​​
  • ​​199. 二叉树的右视图​​
  • ​​637.二叉树的层平均值​​
  • ​​429. N 叉树的层序遍历​​
  • ​​515.在每个树行中找最大值​​
  • ​​116. 填充每个节点的下一个右侧节点指针​​
  • ​​填充每个节点的下一个右侧节点指针II​​
  • ​​104.二叉树的最大深度​​
  • ​​二叉树的最小深度​​

二叉树的层次遍历

二叉树的层次遍历_算法

二叉树的层次遍历

二叉树的层次遍历_算法_02


bfs法:

关键点在于queue.size()

class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {

Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> list = new ArrayList<>();
if(root == null) return list;
queue.add(root);
while(!queue.isEmpty()){
List<Integer> list1 = new ArrayList<>();
//关键
int len = queue.size();

while(len > 0){
TreeNode temp = queue.poll();
list1.add(temp.val);
if(temp.left != null) queue.add(temp.left);
if(temp.right != null) queue.add(temp.right);
len--;
}
list.add(list1);
}
return list;
}
}

二叉树的层次遍历_层序遍历_03


dfs:

递归方式

此方法不太熟悉

class Solution {
List<List<Integer>> resList = new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root) {
dfs(root,0);
return resList;
}
public void dfs(TreeNode root,int k){
if(root == null) return;
//每层k的数字都是固定的
k++;
if(resList.size() < k){
List<Integer> item = new ArrayList<>();
resList.add(item);
}
resList.get(k - 1).add(root.val);
dfs(root.left,k);
dfs(root.right,k);
}
}

二叉树的层次遍历_算法_04

107. 二叉树的层序遍历 II

二叉树的层次遍历_List_05


在上一题基础上反转结果即可​​Collections.reverse()​​,请记住这个方法。

class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> list = new ArrayList<>();
if(root == null) return list;
queue.add(root);
while(!queue.isEmpty()){
List<Integer> list1 = new ArrayList<>();
//关键
int len = queue.size();

while(len > 0){
TreeNode temp = queue.poll();
list1.add(temp.val);
if(temp.left != null) queue.add(temp.left);
if(temp.right != null) queue.add(temp.right);
len--;
}
list.add(list1);
}
Collections.reverse(list);
return list;
}
}

二叉树的层次遍历_深度优先_06

199. 二叉树的右视图

二叉树的层次遍历_层序遍历_07


采用dfs思路

class Solution {
List<Integer> list;
public List<Integer> rightSideView(TreeNode root) {
list = new ArrayList<>();
f(root,0);
return list;
}
void f(TreeNode root,int depth){
if(root == null) return;
depth++;
if(list.size() < depth){
list.add(root.val);
}
f(root.right,depth);
f(root.left,depth);
}
}

二叉树的层次遍历_深度优先_08


bfs法:

// 199.二叉树的右视图
public class N0199 {
/**
* 解法:队列,迭代。
* 每次返回每层的最后一个字段即可。
*
* 小优化:每层右孩子先入队。代码略。
*/
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<>();
Deque<TreeNode> que = new LinkedList<>();

if (root == null) {
return list;
}

que.offerLast(root);
while (!que.isEmpty()) {
int levelSize = que.size();

for (int i = 0; i < levelSize; i++) {
TreeNode poll = que.pollFirst();

if (poll.left != null) {
que.addLast(poll.left);
}
if (poll.right != null) {
que.addLast(poll.right);
}

if (i == levelSize - 1) {
list.add(poll.val);
}
}
}

return list;
}
}

637.二叉树的层平均值

二叉树的层次遍历_List_09

class Solution {
public List<Double> averageOfLevels(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<Double> list = new ArrayList<>();
if(root == null) return list;
queue.add(root);
while(!queue.isEmpty()){
//关键
int len = queue.size();
int length = len;
double res = 0.0;
while(len > 0){
TreeNode temp = queue.poll();
res += temp.val;
if(temp.left != null) queue.add(temp.left);
if(temp.right != null) queue.add(temp.right);
len--;
}
res /= length;
list.add(res);
}
return list;
}
}

二叉树的层次遍历_算法_10

429. N 叉树的层序遍历

二叉树的层次遍历_二叉树_11

class Solution {
public List<List<Integer>> levelOrder(Node root) {
Queue<Node> queue = new LinkedList<>();
List<List<Integer>> list = new ArrayList<>();
if(root == null) return list;
queue.add(root);
while(!queue.isEmpty()){
List<Integer> list1 = new ArrayList<>();
//关键
int len = queue.size();

while(len > 0){
Node temp = queue.poll();
list1.add(temp.val);
//关键点
List<Node> children = temp.children;
for (Node child : children) {
if (child != null) {
queue.offer(child);
}
}
len--;
}
list.add(list1);
}
return list;
}
}

二叉树的层次遍历_二叉树_12

515.在每个树行中找最大值

二叉树的层次遍历_算法_13

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> largestValues(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> list = new ArrayList<>();
if(root == null) return list;
queue.add(root);
while(!queue.isEmpty()){
//关键
int len = queue.size();
int res = Integer.MIN_VALUE;
while(len > 0){
TreeNode temp = queue.poll();
res = Math.max(res,temp.val);
//关键点
if(temp.left != null) queue.offer(temp.left);
if(temp.right != null) queue.offer(temp.right);
len--;
}
list.add(res);

}
return list;
}
}

二叉树的层次遍历_二叉树_14

116. 填充每个节点的下一个右侧节点指针

二叉树的层次遍历_层序遍历_15


本题依然是层序遍历,只不过在单层遍历的时候记录一下本层的头部节点,然后在遍历的时候让前一个节点指向本节点就可以了

class Solution {
public Node connect(Node root) {
Queue<Node> queue = new LinkedList<>();
if(root == null) return null;
queue.add(root);
while(!queue.isEmpty()){
//关键,遍历时提前拎出来头节点
int len = queue.size();
Node temp = queue.poll();
//关键点,先找到每行头节点
if(temp.left != null) queue.offer(temp.left);
if(temp.right != null) queue.offer(temp.right);
for(int index = 1;index < len;index++){
Node next = queue.poll();
if(next.left != null) queue.offer(next.left);
if(next.right != null) queue.offer(next.right);
temp.next = next;
temp = next;
}
}
return root;
}

二叉树的层次遍历_二叉树_16

填充每个节点的下一个右侧节点指针II

二叉树的层次遍历_二叉树_17

104.二叉树的最大深度

二叉树的层次遍历_层序遍历_18

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int res = 0;
public int maxDepth(TreeNode root) {
dfs(root,0);
return res;
}
void dfs(TreeNode root,int k){
if(root == null) return;
k++;
res = Math.max(k,res);
dfs(root.left,k);
dfs(root.right,k);
}
}

二叉树的层次遍历_List_19

二叉树的最小深度

二叉树的层次遍历_层序遍历_20


需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。如果其中一个孩子为空则不是最低点.

dfs:

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int res = Integer.MAX_VALUE;
public int minDepth(TreeNode root) {
dfs(root,0);
return res == Integer.MAX_VALUE?0:res;
}
void dfs(TreeNode root,int k){
if(root == null) return;
k++;
if(root.left == null && root.right == null) res = Math.min(res,k);
dfs(root.left,k);
dfs(root.right,k);

}

}

二叉树的层次遍历_二叉树_21


bfs:

class Solution {
public int minDepth(TreeNode root){
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int depth = 0;
while (!queue.isEmpty()){
int size = queue.size();
depth++;
TreeNode cur = null;
for (int i = 0; i < size; i++) {
cur = queue.poll();
//如果当前节点的左右孩子都为空,直接返回最小深度
if (cur.left == null && cur.right == null){
return depth;
}
if (cur.left != null) queue.offer(cur.left);
if (cur.right != null) queue.offer(cur.right);
}
}
return depth;
}

二叉树的层次遍历_List_22


标签:遍历,TreeNode,层次,temp,queue,right,二叉树,null,root
From: https://blog.51cto.com/u_15911055/6036996

相关文章

  • 二叉树
    二叉树二叉树的概念二叉树是n(n≥0)个结点的有限集或者是空集(n=O),或者由一个根结点及两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成二叉树结构最简单......
  • app自动化遍历工具appcrawler
    monkey测试的缺点,测试太随机,功能比较深的页面可能点击不到自动遍历可以制定规则,指定页面,指定点击控件元素范围(Textview显示文字,EditText输入框,Button按钮,ImageView图片等),......
  • 代码随想录算法训练营第十七天 | 110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和
    一、昨日回顾与补充今天看了Day16讲解的视频,对于求二叉树最大深度、最小深度以及求完全二叉树的节点个数有了新的理解,总结如下:1.深度和高度的区别(之前就看看定义忽略......
  • leetcode-二叉树展开为链表
    //leetcodesubmitregionbegin(Prohibitmodificationanddeletion)/***Definitionforabinarytreenode.*publicclassTreeNode{*intval;*TreeNodeleft;......
  • BM35 判断是不是完全二叉树
    思路:判断一个二叉树是不是完全二叉树,先弄清楚二叉树的定义,只有最后一层和倒数第一层有叶子结点,也就是说当访问到空节点时,后面不应该再有节点可访问了。即空节点一定是在......
  • 利用引用传递一次遍历构造菜单树(附java&go demo)
    目录原理讲解javademoGodemo优点原理讲解利用引用传递,当儿子的儿子变动的时候,自己的儿子的儿子也变动(取地址)javademopackagecom.huiyuan.algorithm;importjava.......
  • 二叉树的遍历
    二叉树的遍历一、二叉树的遍历算法可以将二叉树的遍历分为:先序遍历(根、左、右),中序遍历(左、根、右),后序遍历(左、右、根)先序遍历动画(根、左、右)中序遍历......
  • BM26 求二叉树的层序遍历
    思路:逐层访问,通过访问当前层来得到下一层的节点。结束标志是下一层没有节点。Gopackagemainimport."nc_tools"/**typeTreeNodestruct{*Valint*Left......
  • 小白科普丨何为树、二叉树和森林?
    摘要:本文为大家带来树、二叉树和森林的表示及如何进行相互转换。本文分享自华为云社区《树、二叉树和森林的表示及相互转换》,作者:1+1=王。树的基本概念树的定义:树是n(n......
  • 【DFS】LeetCode 105. 从前序与中序遍历序列构造二叉树
    题目链接105.从前序与中序遍历序列构造二叉树思路先序遍历的顺序是根左右,中序遍历的顺序是左根右,所以在preorder数组中的首元素一定是当前树的树根,再从inorder数组......