二叉树的层序遍历 LeetCode 102
题目链接:[LeetCode 102 - 中等]
思路
层序遍历
迭代(借助队列):
class Solution {
public List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
check(root);
return result;
}
public void check(TreeNode node){
if(node==null) return;
Queue<TreeNode> que = new LinkedList<>();
que.offer(node);
while(!que.isEmpty()){
List<Integer> res = new ArrayList<>();
int len = que.size();
while(len>0){
TreeNode tmp = que.poll();
res.add(tmp.val);
if(tmp.left!=null)que.offer(tmp.left);
if(tmp.right!=null)que.offer(tmp.right);
len--;
}
result.add(res);
}
}
}
二叉树的层序遍历Ⅱ LeetCode 107
题目链接:[LeetCode 107 - 中等]
思路
层序遍历
迭代(借助队列):
class Solution {
public List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> levelOrderBottom(TreeNode root) {
check(root);
return result;
}
private void check(TreeNode node){
if(node==null)return;
Queue<TreeNode> que = new LinkedList<>();
que.offer(node);
while(!que.isEmpty()){
List<Integer> res = new ArrayList<>();
int len = que.size();
while(len>0){
TreeNode tmp = que.poll();
res.add(tmp.val);
if(tmp.left!=null)que.offer(tmp.left);
if(tmp.right!=null)que.offer(tmp.right);
len--;
}
result.add(0,res);
}
}
}
思考
相较于102 有一个List的反转操作,体现在代码上的为:result.add(0,res);的修改
二叉树的右视图 LeetCode 199
题目链接:[LeetCode 199 - 中等]
思路
层序遍历
迭代(借助队列):
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root==null)return result;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int len = que.size();
while(len>0){
TreeNode node = que.poll();
if(len==1){
result.add(node.val);
}
if(node.left!=null)que.offer(node.left);
if(node.right!=null)que.offer(node.right);
len--;
}
}
return result;
}
}
二叉树的层平均值 LeetCode 637
题目链接:[LeetCode 637 - 中等]
思路
层序遍历
迭代(借助队列):
class Solution {
public List<Double> averageOfLevels(TreeNode root) {
List<Double> result = new ArrayList<>();
if(root==null)return result;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
double average = 0.0;
int len = que.size();
for(int i=len;i>0;i--){
TreeNode node = que.poll();
average += node.val;
if(node.left!=null)que.offer(node.left);
if(node.right!=null)que.offer(node.right);
}
average /= len;
result.add(average);
}
return result;
}
}
思考
当时仍然使用while(len>0)会导致最后的时候len变为0,发生java.lang.RuntimeException: Infinite or NaN异常
N叉树的层序遍历 LeetCode 429
题目链接:[LeetCode 429 - 中等]
思路
层序遍历
迭代(借助队列):
class Solution {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> result = new ArrayList<>();
if(root==null) return result;
Queue<Node> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int len = que.size();
List<Integer> res = new ArrayList<>();
while(len>0){
Node node = que.poll();
res.add(node.val);
if(node.children!=null||node.children.size()>0){
for(Node child:node.children){
if(child!=null){
que.offer(child);
}
}
}
len--;
}
result.add(res);
}
return result;
}
}
在每个树行中找最大值 LeetCode 515
题目链接:[LeetCode 515 - 中等]
思路
层序遍历
迭代(借助队列):
class Solution {
public List<Integer> largestValues(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root==null)return result;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int max = Integer.MIN_VALUE;
int len = que.size();
while(len>0){
TreeNode node = que.poll();
max = Math.max(max,node.val);
if(node.left!=null)que.offer(node.left);
if(node.right!=null)que.offer(node.right);
len--;
}
result.add(max);
}
return result;
}
}
填充每个节点的下一个右侧节点指针 LeetCode 116
题目链接:[LeetCode 116 - 中等]
思路
层序遍历
迭代(借助队列):
class Solution {
public Node connect(Node root) {
Node head = new Node();
head.left = root;
if(root==null)return root;
Queue<Node> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int len = que.size();
while(len>0){
Node cur = que.poll();
if(len!=1){
cur.next = que.peek();
}
if(cur.left!=null)que.add(cur.left);
if(cur.right!=null)que.add(cur.right);
len--;
}
}
return head.left;
}
}
填充每个节点的下一个右侧节点指针Ⅱ LeetCode 117
题目链接:[LeetCode 117 - 中等]
思路
Ⅰ与Ⅱ的思路一致。
迭代(借助队列):
class Solution {
public Node connect(Node root) {
if(root==null)return root;
Queue<Node> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int len = que.size();
while(len>0){
Node cur = que.poll();
if(len!=1){
cur.next = que.peek();
}
if(cur.left!=null)que.add(cur.left);
if(cur.right!=null)que.add(cur.right);
len--;
}
}
return root;
}
}
二叉树的最大深度 LeetCode 104
题目链接:[LeetCode 104 - 简单]
思路
迭代(借助队列):
class Solution {
public int maxDepth(TreeNode root) {
int max = 0;
if(root==null)return max;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int len = que.size();
while(len>0){
TreeNode node = que.poll();
if(node.left!=null)que.offer(node.left);
if(node.right!=null)que.offer(node.right);
len--;
}
max++;
}
return max;
}
}
总结
注意递归与遍历的顺序
二叉树的最小深度 LeetCode 111
题目链接:[LeetCode 111 - 简单]
思路
如何判断叶子节点 - 如何设置退出条件
递归:
class Solution {
public int minDepth(TreeNode root) {
int min = 0;
if(root==null)return min;
Queue<TreeNode> que = new LinkedList<>();
que.offer(root);
while(!que.isEmpty()){
int len = que.size();
min++;
while(len>0){
TreeNode node = que.poll();
if(node.left==null&&node.right==null){
que.clear();
break;
}
if(node.left!=null)que.offer(node.left);
if(node.right!=null)que.offer(node.right);
len--;
}
}
return min;
}
}
总结
1.如何判断叶子节点 node.left==null&&node.right==null
2.如何设置退出条件 que.clear(); break;