【算法训练】LeetCode#102 二叉树的层序遍历
一、描述
102. 二叉树的层序遍历
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
二、思路
这种经典题肯定有很多经典解法,我没有做过,暂时只想到了宽度优先入队后按照层数计算节点数的方式存储每层节点(还是太菜)。
三、解题
public static 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;
}
}
public static class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
int sums = 0;
int next = 1;
List<List<Integer>> lists = new ArrayList<>();
queue.add(root);
List<Integer> oneFloor = new ArrayList<>();
while (!queue.isEmpty()){
TreeNode node = queue.poll();
sums++;
if (node != null){
oneFloor.add(node.val);
queue.add(node.left);
queue.add(node.right);
}
if (sums == next && oneFloor.size() > 0){
sums = 0;
List<Integer> tmp = new ArrayList<>(oneFloor);
lists.add(tmp); // 满了放入总list
oneFloor.clear();
next = tmp.size() * 2; // 上一层有几个节点,下一层就有2*size的节点数量
}
}
if (oneFloor.size() > 0){
lists.add(oneFloor);
}
return lists;
}
// 递归算法
public List<List<Integer>> levelOrderV2(TreeNode root) {
List<List<Integer>> lists = new ArrayList<>();
process(lists,root,0);
return lists;
}
// 广度优先搜索
public void process(List<List<Integer>> lists,TreeNode root,int level){
if (root == null){
return;
}
if (lists.size() == level){
lists.add(new ArrayList<>()); // 给每层加空list
}
lists.get(level).add(root.val); // 给level层加入val
process(lists,root.left,level+1);
process(lists,root.right,level+1);
}
}