3 二叉树的层序遍历
3.1 102. 二叉树的层序遍历
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。
需要借用一个辅助数据结构即队列来实现,「队列先进先出,符合一层一层遍历的逻辑,而是用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。」
「而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。」
/**
* 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<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if(root!=null) queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
List<Integer> tmp = new ArrayList<>();
for(int i=0;i<size;i++){
TreeNode node = queue.poll();
tmp.add(node.val);
if(node.left!=null){queue.offer(node.left);}
if(node.right!=null){queue.offer(node.right);}
}
res.add(tmp);
}
return res;
}
}
3.2 107. 二叉树的层序遍历 II
与层序遍历相比,我们只需把层序遍历得到的结果(List集合)反转一下,即可得到二叉树自底向上的层序遍历。
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if(root!=null) queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
List<Integer> tmp = new ArrayList<>();
for(int i=0;i<size;i++){
TreeNode node = queue.poll();
tmp.add(node.val);
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
}
res.add(tmp);
}
Collections.reverse(res);
return res;
}
}
3.3 199. 二叉树的右视图
仅需在层序遍历的基础上,判断当前下标i是否是这一层的最右边元素(i==size-1)。
如果是最右边元素,加入结果集合。
遍历结束返回结果集合即可。
class Solution {
public List<Integer> rightSideView(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<Integer> res = new ArrayList<>();
if(root!=null) queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0;i<size;i++){
TreeNode node = queue.poll();
if(i==size-1){res.add(node.val);}
if(node.left!=null){queue.offer(node.left);}
if(node.right!=null){queue.offer(node.right);}
}
}
return res;
}
}
3.4 637. 二叉树的层平均值
仅需在层序遍历的基础上,对每一层的元素做累加和,并判断当前下标i是否是这一层的最右边元素(i==size-1)。
如果是最右边元素,则计算一次平均值。加入结果集合。
遍历结束返回结果集合即可。
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<Double> res = new ArrayList<>();
if(root!=null) queue.offer(root);
while(!queue.isEmpty()){
int size = queue.size();
double sum = 0;
for(int i=0;i<size;i++){
TreeNode node = queue.poll();
if(node!=null) sum+=node.val;
if(node.left!=null) queue.offer(node.left);
if(node.right!=null) queue.offer(node.right);
if(i==size-1){
res.add(sum/size);
}
}
}
return res;
}
}
3.5 429. N 叉树的层序遍历
仅需在层序遍历的基础上,将对左右子树的判断改为对当前节点的children的Node集合进行遍历,并将非空的子节点加入queue。
遍历结束返回结果集合即可。
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
public List<List<Integer>> levelOrder(Node root) {
Queue<Node> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
if(root!=null) queue.offer(root);
while(!queue.isEmpty()){
List<Integer> tmp = new ArrayList<>();
int size = queue.size();
for(int i=0;i<size;i++){
Node node = queue.poll();
tmp.add(node.val);
List<Node> childs = node.children;
for(Node ch:childs ){
if(ch!=null) queue.offer(ch);
}
}
res.add(tmp);
}
return res;
}
}