第二十九天
一、今日学习核心内容
1. 二叉树遍历优化:掌握递归遍历(前/中/后序)的代码简化技巧,理解迭代遍历的栈模拟逻辑(以中序遍历非递归实现为重点)。
2. 高频算法题突破:
- 二叉树的层序遍历(BFS实现,含按层输出节点值);
- 对称二叉树判断(递归+迭代两种思路);
- 二叉树的最大深度计算(DFS深度优先 vs BFS广度优先)。
3. 底层逻辑梳理:明确二叉树节点的定义规范,理解“左子树小于根、右子树大于根”的二叉搜索树(BST)特性,为后续应用铺垫。
二、关键代码实现(Java)
-
二叉树节点定义(基础结构)
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
// 构造方法
public TreeNode(int val) {
this.val = val;
this.left = null;
this.right = null;
}
} -
中序遍历(迭代实现,核心难点)
public ListinorderTraversal(TreeNode root) {
Listres = new ArrayList<>();
Dequestack = new LinkedList<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
// 遍历左子树,全部入栈
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
// 弹出栈顶节点,记录值
cur = stack.pop();
res.add(cur.val);
// 转向右子树
cur = cur.right;
}
return res;
} -
对称二叉树判断(递归实现)
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
// 递归判断左右子树是否对称
return checkSymmetric(root.left, root.right);
}
private boolean checkSymmetric(TreeNode left, TreeNode right) {
// 左右都为空,对称
if (left == null && right == null) return true;
// 一方为空另一方不为空,不对称
if (left == null || right == null) return false;
// 节点值相等,且左子树的左与右子树的右对称、左子树的右与右子树的左对称
return (left.val == right.val)
&& checkSymmetric(left.left, right.right)
&& checkSymmetric(left.right, right.left);
}
三、问题与调试记录
1. 迭代遍历栈操作错误:初始未处理“cur不为空”的循环条件,导致左子树节点漏入栈,调试时通过打印栈元素轨迹定位问题。
2. 对称判断逻辑疏漏:未考虑“单节点树是否对称”的边界情况,补充root为空的判断后修复。
3. 时间复杂度理解偏差:初始认为层序遍历的时间复杂度为O(n²),后通过分析“每个节点入队出队各一次”修正为O(n)。
四、总结与明日计划
- 今日收获:掌握二叉树3种遍历的递归/迭代实现,理解对称判断、深度计算的核心逻辑,强化了“边界条件处理”和“栈/队列数据结构的应用”。
- 薄弱点:迭代遍历的栈操作逻辑仍需熟练,二叉搜索树的特性应用尚未实践。
- 明日计划:学习二叉搜索树的增删改查操作,刷2道相关算法题(验证二叉搜索树、二叉搜索树的最近公共祖先),并总结树结构的通用解题思路。

浙公网安备 33010602011771号