
⚙️个人专栏:
《Java算法时空: 图解手撕原理》 《 多线程 》 《JavaSE基础原理 》 《数据结构》
✨与其内耗自己,不如责备他人



一. 力扣 429. N 叉树的层序遍历
1. 题目
层序遍历的非递归实现, 用队列总没错!
2. 算法原理
3. 代码
java
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> ret = new ArrayList<>();
if (root == null) {
return ret;
}
Queue<Node> q = new LinkedList<>();
q.offer(root);
while (!q.isEmpty()) {
List<Integer> list = new ArrayList<Integer>();
int size = q.size();
while (size > 0) {
Node tmp = q.poll();
list.add(tmp.val);
for (Node node : tmp.children) {
q.offer(node);
}
size--;
}
ret.add(list);
}
return ret;
}
二. 力扣 103. 二叉树的锯齿形层序遍历
1. 题目
题意给的很清楚,即偶数行的值要逆序
2. 算法原理
3. 代码
java
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> ret = new ArrayList<>();
if (root == null) {
return ret;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
boolean flag = true;
while (!queue.isEmpty()) {
flag = !flag;
int num = queue.size();
List<Integer> list = new ArrayList<>();
while (num > 0) {
TreeNode tmp = queue.poll();
list.add(tmp.val);
if (tmp.left != null) {
queue.offer(tmp.left);
}
if (tmp.right != null) {
queue.offer(tmp.right);
}
num--;
}
if (flag) {
Collections.reverse(list);
}
ret.add(list);
}
return ret;
}
三. 力扣 662. 二叉树最大宽度
1. 题目
题目意思是让求整颗二叉树中最大的宽度,需要注意的是:宽度是指最左和最右节点中间的距离,中间的空节点也计算在内
2. 算法原理
这里的pair我们可以理解为只是一个普通的泛型类
3. 代码
java
public int widthOfBinaryTree(TreeNode root) {
List<Pair<TreeNode, Integer>> q = new ArrayList<>();
q.add(new Pair<TreeNode, Integer>(root,1));
int ret = 0;
while (!q.isEmpty()) {
// 求这一层的个数
Pair<TreeNode, Integer> p1 = q.get(0);
Pair<TreeNode, Integer> p2 = q.get(q.size() - 1);
ret = Math.max(ret, p2.getValue() - p1.getValue() + 1);
// 加入下一层
List<Pair<TreeNode, Integer>> tmp = new ArrayList<>();
for (Pair<TreeNode, Integer> p: q) {
TreeNode node = p.getKey();
int n = p.getValue();
if (node.left != null) {
tmp.add(new Pair<TreeNode, Integer>(node.left, 2 * n));
}
if (node.right != null) {
tmp.add(new Pair<TreeNode, Integer>(node.right, 2 * n + 1));
}
}
q = tmp;
}
return ret;
}
四. 力扣 515. 在每个树行中找最大值
1. 题目
这道题应该是这个系列最简单的了, 找每层的最大值, 然后加入到列表中
2. 算法原理
这道题我们直接根据上面层序遍历的模版,然后只需要在便利每层时,加上一个求最大值的表达式即可,可以说是四个题中最简单的
3. 代码
java
public List<Integer> largestValues(TreeNode root) {
List<Integer> ret = new ArrayList<>();
if (root == null) {
return ret;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int n = queue.size();
int tmp = Integer.MIN_VALUE;
while (n > 0) {
TreeNode node = queue.poll();
tmp = Math.max(tmp, node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
n--;
}
ret.add(tmp);
}
return ret;
}







