408算法练习——二叉树层序遍历

二叉树层序遍历

题目连接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/

一、问题描述

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],

 3
 / \
9 20
 / \
  15 7
返回其自底向上的层序遍历为:

[
[15,7],
[9,20],
[3]
]

二、问题分析

  BFS算法:新建一个队列,一个size标记变量记录每层元素个数,一个结果链表用于保存结果

  接下来模拟遍历过程,首先根节点3进队,如果队列不为空,就让size=队列大小,循环size,如果size不为0,就出队队首元素到临时数组,而且将当前元素的左右孩子入队,出队后size--,当size=0,但队列大小不为0,就将size等于队列大小,然后循环size

  上述过程中,size表示的就是每层队列的元素数量,当size降为0,则说明这层元素全部出队,如果此时队列不空,说明下层还有元素没有遍历到。遍历完一层可以是用单链表头插法将该层所有元素插入链表中。

三、代码

  

 1 class Solution {
 2    
 3   public List<List<Integer>> levelOrderBottom(TreeNode root) {
 4         List<List<Integer>> result = new ArrayList<>();
 5         if (root == null) {
 6             return result;
 7         }
 8         Queue<TreeNode> q = new LinkedList<>();
 9         q.add(root);
10         LinkedList<ArrayList<Integer>> temp = new LinkedList<>();
11         while (q.size() > 0) {        //代表遍历每一层
12             int size = q.size();        //修改size的值,为当前层上节点数量
13             ArrayList<Integer> list = new ArrayList<>();
14             while (size > 0) {        //size不为0说明这层节点还每遍历完
15                 TreeNode cur = q.poll();
16                 list.add(cur.val);        //将出队元素加入临时数组
17                 if (cur.left != null) {        //将出队元素的左右节点加入队列
18                     q.add(cur.left);
19                 }
20                 if (cur.right != null) {
21                     q.add(cur.right);
22                 }
23                 size--;
24             }
25             temp.addFirst(new ArrayList<>(list));
26         }
27             result = new ArrayList<>(temp);       
28     return result;
29     }
30 }

 

posted @ 2021-08-09 21:06  瑜琦  阅读(95)  评论(0)    收藏  举报