本次题目
- 102 二叉树的层序遍历
- 107 二叉树的层次遍历II
- 199 二叉树的右视图
- 637 二叉树的层平均值
- 429 N叉树的层序遍历
- 515 在每个树行中找最大值
- 116 填充每个节点的下一个右侧节点指针
- 117 填充每个节点的下一个右侧节点指针II
- 104 二叉树的最大深度
- 111 二叉树的最小深度
102 二叉树的层序遍历
- 层序遍历:迭代(使用队列)或递归。注意:在每次循环取出每层元素时队列长度变化,循环长度应固定为队列初始长度(该层元素个数)。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root == null) return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode node = root;
queue.offer(node);
while(!queue.isEmpty()){
int L = queue.size();
List<Integer> res = new ArrayList<Integer>();
for(int i = 0; i < L; i++){
node = queue.poll();
res.add(node.val);
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
result.add(res);
}
return result;
}
}
107 二叉树的层次遍历II
List<List<Integer>> result2 = new ArrayList<List<Integer>>();
for(int i = result.size() - 1; i >= 0; i--){
result2.add(result.get(i));
}
return result2;
199 二叉树的右视图
- 同上102,只有当遍历到该层最后一个元素时将其添加到结果数组。
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null) return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode node = root;
queue.offer(node);
while(!queue.isEmpty()){
int L = queue.size();
for(int i = 0; i < L; i++){
node = queue.poll();
if(i == L - 1) result.add(node.val);
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
}
return result;
}
}
637 二叉树的层平均值
- 同上102,将结果数组每层求均值再存入结果数组。注意:返回Double。
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
List<Double> result = new ArrayList<Double>();
if(root == null) return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode node = root;
queue.offer(node);
while(!queue.isEmpty()){
int L = queue.size();
double sum = 0.0;
for(int i = 0; i < L; i++){
node = queue.poll();
sum += node.val;
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
result.add(sum/L);
}
return result;
}
}
429 N叉树的层序遍历
- 同上102,每个节点可能有多个孩子,但是不影响,每层的元素个数按取出元素的所有孩子个数计算。
class Solution {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root == null) return result;
Queue<Node> queue = new LinkedList<Node>();
Node node = root;
queue.offer(node);
while(!queue.isEmpty()){
int L = queue.size();
List<Integer> res = new ArrayList<Integer>();
for(int i = 0; i < L; i++){
node = queue.poll();
res.add(node.val);
if(node.children != null){
List<Node> chs = node.children;
for(int j = 0; j < chs.size(); j++){
queue.offer(chs.get(j));
}
}
}
result.add(res);
}
return result;
}
}
515 在每个树行中找最大值
- 同上102,求结果数组每层的最大值,再存入结果数组。注意:List求最大值Collections.max()。
class Solution {
public List<Integer> largestValues(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null) return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode node = root;
queue.offer(node);
while(!queue.isEmpty()){
int L = queue.size();
List<Integer> res = new ArrayList<Integer>();
for(int i = 0; i < L; i++){
node = queue.poll();
res.add(node.val);
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
result.add(Collections.max(res));
}
return result;
}
}
116 填充每个节点的下一个右侧节点指针
- 同上102,每层的前一个节点指向后一个节点,最后一个节点指向null(不用修改)。
class Solution {
public Node connect(Node root) {
if(root == null) return root;
Queue<Node> queue = new LinkedList<Node>();
queue.offer(root);
while(!queue.isEmpty()){
int L = queue.size();
Node node = queue.poll();
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
for(int i = 1; i < L; i++){
Node next = queue.poll();
if(next.left != null) queue.offer(next.left);
if(next.right != null) queue.offer(next.right);
node.next = next;
node = next;
}
}
return root;
}
}
117 填充每个节点的下一个右侧节点指针II
- 同上116,116是完美二叉树但是本题不是,但是不影响,每层元素是按上层取出元素的左右孩子节点构成。
104 二叉树的最大深度
- 同上102,不用记录每层元素,定义整数记录层数,最后返回。
class Solution {
public int maxDepth(TreeNode root) {
int result = 0;
if(root == null) return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode node = root;
queue.offer(node);
while(!queue.isEmpty()){
int L = queue.size();
for(int i = 0; i < L; i++){
node = queue.poll();
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
result++;
}
return result;
}
}
111 二叉树的最小深度
- 同上104,当该层有一个节点的左右孩子都为空时,即为最小深度。注意:循环开始时层数先加1。
class Solution {
public int minDepth(TreeNode root) {
int result = 0;
if(root == null) return result;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
TreeNode node = root;
queue.offer(node);
while(!queue.isEmpty()){
result++;
int L = queue.size();
for(int i = 0; i < L; i++){
node = queue.poll();
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
if(node.left == null && node.right == null) return result;
}
}
return result;
}
}