前言: 本文将介绍一下本人在力扣中的刷题记录
一, 层序遍历
题目链接 :

思路
层序遍历的核心是 一层一层地遍历二叉树节点 , 只有遍历当前层的节点才能访问下一层节点
遍历顺序以根节点为起点, 向水波一样逐层向外扩散遍历, 对于这类问题, 通用解法是使用bfs, 广度优先遍历的思路和层序遍历一致
bfs的核心是使用队列queue来存储同一层的节点
代码(bfs)
java
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> rest = new ArrayList<>();
if(root == null) return rest;
Queue<TreeNode> queue = new LinkedList<>();
//预处理根节点
queue.offer(root);
//bfs
while(!queue.isEmpty()){
int curLevelCount = queue.size();
List<Integer> list = new ArrayList<>();
for(int i = 0;i < curLevelCount;i++){
TreeNode node = queue.poll();
list.add(node.val);//添加当前节点
//处理node的孩子节点入队列
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
//处理完一层,把当前list添加到结果rest
rest.add(list);
}
return rest;
}
}
二, 中序遍历
题目链接:

注意根节点的访问时机即可
代码
java
class Solution {
private List<Integer> list = new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
if(root == null) return list;
inorderTraversal(root.left);//左
list.add(root.val);//根
inorderTraversal(root.right);//右
return list;
}
}
二,计算树高
题目链接 :

思路
对于计算树高, 这里有两种解法
解法一 : 从根节点开始自上而下地统计树高
解法二: 进行递归遍历二叉树, 自下而上, 回归时记录子树高度, 结果取最大值
对于解法一, 我们从根节点触发, 每遇到一个新的节点,就把临时高度high++, 为什么是临时高度high呢? 因为递归只能先处理一边的子树, 最终返回的最大树高,不能得知另一侧的树高,所以还需要维护一个最大树高ans,两者之间取最大值即可
对于解法二, 我们直接递推到树的叶子节点,然后进行向上的回归操作, 每次回归都相当于向上返回一层, 如果是解法一是从root 从0 开始计算树高. 那么解法二就是把最下方的叶子所处层视为最底层,回归时累积树高 . 同理, 左右子树高度也要取最大值
1.代码(自上而下)
java
class Solution {
private int ans;
public int maxDepth(TreeNode root) {
if(null == root) return 0;
dfs(root,0);
return ans;
}
//从root根节点自上而下统计树高
public void dfs(TreeNode root,int high){
//递归终止条件
if(root == null){
return;
}
//不为空,则高度增加
high++;
ans = Math.max(ans,high);//更新结果,最大树高
dfs(root.left,high);
dfs(root.right,high);
}
}
2. 代码(自下而上)
java
class Solution {
public int maxDepth(TreeNode root) {
if(root == null) return 0;
//递归记录左右子树高度
int leftHigh = maxDepth(root.left);
int rightHigh = maxDepth(root.right);
return Math.max(leftHigh,rightHigh) + 1;
}
}