文章目录
leetcode 102
题目链接
二叉树层序遍历 level order traversal
思路:
- 使用队列保存节点
- 题目要求层序遍历输出时,划分每一层元素
- 用
size
记录每一层的元素个数
- 用
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
Queue<TreeNode> queue = new LinkedList<>();
if (root != null)
queue.add(root);
while (!queue.isEmpty()) {
//每次一开始队列中元素个数就是该层节点个数
int size = queue.size();
List<Integer> r = new ArrayList<>();
for (int i = 0; i < size; ++i) {
TreeNode t = queue.remove();
r.add(t.val);
if (t.left != null)
queue.add(t.left);
if (t.right != null)
queue.add(t.right);
}
res.add(r);
}
return res;
}
}
其他相关层序遍历的题目
leetcode 107
leetcode 107
从最下面一层开始,层序遍历
思路:
- 正常层序遍历
- 最后反转结果
代码略
leetcode 199
leetcode 199
只返回二叉树最右侧的一列节点
思路:
- 同理还是层序遍历
- 但注意右视图,先入队列的是右节点
代码略
leetcode 637
leetcode 637
每一层节点平均值
思路:
- 层序遍历
- 遍历时顺便求平均值,注意每一层求和以及最后 ÷ \div ÷个数的匹配
代码略
leetcode 429
leetcode 429
森林的层序遍历
思路:
- 同二叉树的层序遍历
代码略
leetcode 515
leetcode 515
找每一层最大值
思路:
- 仍然是树的层序遍历
- 注意节点的范围是
−
2
31
≤
-2^{31} \le
−231≤
Node.val
≤ 2 31 − 1 \le 2^{31} - 1 ≤231−1,因此每一层记录最大值的变量初始化应该为:int max = Integer.MIN_VALUE;
leetcode 116 & 117
leetcode 116
leetcode 117
两题本质相同
思路:
- 层序遍历变种,将每一层的节点像链表一样连接起来
class Solution {
public Node connect(Node root) {
Node res = root;
Deque<Node> q = new LinkedList<>();
if (root != null)
q.add(root);
while (!q.isEmpty()) {
int n = q.size();
for (int i = 0; i < n; ++i) {
Node t = q.remove();
if (i == n - 1)
t.next = null;
else
t.next = q.peek();
if (t.left != null) q.add(t.left);
if (t.right != null) q.add(t.right);
}
}
return res;
}
}
leetcode 104
leetcode 104
求二叉树最大深度的题
思路:
- 本质上还是可以通过层序遍历解决
leetcode 111
leetcode 111
求二叉树最小深度
二叉树最小深度
- 从根节点开始,到离
root
最近的叶子节点的路径长度
leetcode 226
题目链接
翻转 invert 二叉树的所有左右子树
思路:
- 在遍历的时候,交换左右子树
- 选择前序、后序或者层序遍历均可
- 因为中序遍历中,要先访问
root
,然后再访问root.left
,再返回访问root
,再去访问root.right
,相当于父节点要访问两次
- 因为中序遍历中,要先访问
// 递归写法
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null)
return null;
invertTree(root.left);
invertTree(root.right);
invert(root);
return root;
}
public void invert(TreeNode node) {
TreeNode t = node.left;
node.left = node.right;
node.right = t;
}
}