二叉树的层序遍历是借助队列 Queue实现的。
代码注意点 ① for循环是为了保证弹出每一行不多不少的节点,
②每一行的大小通过上一步骤的队列size确定,但是要通过另一个变量保存起来,因为队列的大小是会动态变化的
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();//又错了
if(root == null) return ans;
Queue<TreeNode> q = new LinkedList<TreeNode>(); //又错了
q.offer(root);
int size = 0;
while(!q.isEmpty()) {
size = q.size();
List<Integer> qq = new ArrayList<>();
for(int i = 0; i < size; i++) {
//这里不可以用q.size(),因为poll之后是会变的
TreeNode tmp = q.poll();
qq.add(tmp.val);添加的是值,不是节点
if(tmp.left != null) q.offer(tmp.left);
if(tmp.right != null) q.offer(tmp.right);
}
ans.add(qq);
}
return ans;
}
}
Queue<TreeNode> q = new LinkedList<TreeNode>();
List>
的声明List<List<Integer>> ans = new ArrayList<List<Integer>>();
思想就是,converse 普通的层序遍历的结果
class Solution {
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if(root == null) return ans;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
int size = 1;
while(!que.isEmpty()) {
size = que.size();
List<Integer> item = new ArrayList<>();
for(int i = 0; i < size; i++) {
TreeNode tmp = que.poll(); // poll & pop
item.add(tmp.val);
if(tmp.left != null) que.offer(tmp.left);
if(tmp.right != null) que.offer(tmp.right);
}
ans.add(item);
}
Collections.reverse(ans);
return ans;
}
}
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
int size = 1;
while(!que.isEmpty()) {
size = que.size();
for(int i = 0; i < size; i++) {
TreeNode tmp = que.poll(); // poll & pop
if(i == size-1) {
ans.add(tmp.val);
}
if(tmp.left != null) que.offer(tmp.left);
if(tmp.right != null) que.offer(tmp.right);
}
}
return ans;
}
}
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
List<Double> ans = new ArrayList<>();
if(root == null) return ans;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
int size = 1;
while(!que.isEmpty()) {
size = que.size();
double sum = 0.0;
for(int i = 0; i < size; i++) {
TreeNode tmp = que.poll(); // poll & pop
sum += tmp.val;
if(tmp.left != null) que.offer(tmp.left);
if(tmp.right != null) que.offer(tmp.right);
}
sum /= size;
ans.add(sum);
}
return ans;
}
}
class Solution {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if(root == null) return ans;
Queue<Node> q = new LinkedList<>();
q.offer(root);
int size = 0;
while(!q.isEmpty()) {
size = q.size();
List<Integer> item = new ArrayList<>();
for(int i = 0; i < size; i++) {
//这里不可以用q.size(),因为poll之后是会变的
Node tmp = q.poll();
item.add(tmp.val);添加的是值,不是节点
for(Node n : tmp.children) {
if(n != null) {
q.offer(n);
}
}
}
ans.add(item);
}
return ans;
}
}
// 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;
}
};
二叉树中,访问某节点a的左孩子 右孩子的方法是,a.left 和 a.right。
在N叉树中,可以利用增强for
class Solution {
public List<Integer> largestValues(TreeNode root) {
List<Integer> ans = new ArrayList<>();
if(root == null) return ans;
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(root);
int size = 0;
while(!q.isEmpty()) {
size = q.size();
int max = Integer.MIN_VALUE;//错了
for(int i = 0; i < size; i++) {
TreeNode tmp = q.poll();
if(tmp.val > max) max = tmp.val;
if(tmp.left != null) q.offer(tmp.left);
if(tmp.right != null) q.offer(tmp.right);
}
ans.add(max);
}
return ans;
}
}
初始值设置成Integer中的 MIN_VALUE或者MAX_VALUE,不可以是0。
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
max = Math.max(max, node.val);