二叉树层序遍历
利用二叉树层序遍历可以解决如下问题:
- 102.二叉树的层序遍历
- 107.二叉树的层次遍历II
- 199.二叉树的右视图
- 637.二叉树的层平均值
- 429.N叉树的层序遍历
- 515.在每个树行中找最大值
- 116.填充每个节点的下一个右侧节点指针
- 117.填充每个节点的下一个右侧节点指针II
- 104.二叉树的最大深度
- 111.二叉树的最小深度
使用while控制从上到下一层一层遍历,for用于控制每一层从左到右依次遍历
二叉树层序遍历模板:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<>();
if(root == null){
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int sz = queue.size();
List<Integer> level = new LinkedList<>();
for(int i = 0;i < sz;i++){
TreeNode cur = queue.poll();
level.add(cur.val);
if(cur.left != null){
queue.offer(cur.left);
}
if(cur.right != null){
queue.offer(cur.right);
}
}
res.add(level);
}
return res;
}
}
226.翻转二叉树
该题在遍历二叉树时便可以解决,只需要对每一个节点的左右子节点进行翻转即可
所以只需要在进入节点前对每一个节点的做优子节点进行交换(前序遍历)
代码如下:
class Solution {
public TreeNode invertTree(TreeNode root) {
traverse(root);
return root;
}
public void traverse(TreeNode root){
if(root == null){
return;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
traverse(root.left);
traverse(root.right);
}
}
101. 对称二叉树
该题本质便是判断根节点的左右子树是否镜像对称,则同时遍历左右子树进行比较即可
完整代码如下:
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
// 检查两棵子树是否对称
return check(root.left, root.right);
}
// 定义:判断输入的两棵树是否是镜像对称的
boolean check(TreeNode left, TreeNode right) {
if (left == null || right == null) {
return left == right;
}
// 两个根节点需要相同
if (left.val != right.val) return false;
// 左右子树也需要镜像对称
return check(left.right, right.left) && check(left.left, right.right);
}
}