第二十九天

一、今日学习核心内容

1. 二叉树遍历优化:掌握递归遍历(前/中/后序)的代码简化技巧,理解迭代遍历的栈模拟逻辑(以中序遍历非递归实现为重点)。
2. 高频算法题突破:

  • 二叉树的层序遍历(BFS实现,含按层输出节点值);
  • 对称二叉树判断(递归+迭代两种思路);
  • 二叉树的最大深度计算(DFS深度优先 vs BFS广度优先)。
    3. 底层逻辑梳理:明确二叉树节点的定义规范,理解“左子树小于根、右子树大于根”的二叉搜索树(BST)特性,为后续应用铺垫。

二、关键代码实现(Java)

  1. 二叉树节点定义(基础结构)
    public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    // 构造方法
    public TreeNode(int val) {
    this.val = val;
    this.left = null;
    this.right = null;
    }
    }

  2. 中序遍历(迭代实现,核心难点)
    public List inorderTraversal(TreeNode root) {
    List res = new ArrayList<>();
    Deque stack = 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;
    }

  3. 对称二叉树判断(递归实现)
    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道相关算法题(验证二叉搜索树、二叉搜索树的最近公共祖先),并总结树结构的通用解题思路。
posted @ 2025-11-12 17:10  yang…  阅读(6)  评论(0)    收藏  举报