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 }

浙公网安备 33010602011771号