非递归BST插入通过cur和parent双指针实现:cur遍历,parent始终指向其父;空树时直接赋值root;循环至cur为null后,根据val与parent.val大小关系挂载到parent.left或right。

非递归方式实现二叉搜索树(BST)的插入,核心在于用循环替代函数调用栈,同时动态维护父节点和当前遍历节点的引用。关键不是“记位置”,而是“走一步、定一格”——每比较一次,就决定往左还是右移动,并实时更新父指针,直到找到空位。
明确双指针职责:cur 与 parent 分工清晰
声明两个节点指针:cur 负责向下探索路径,parent 始终指向 cur 的上一个节点。初始时 cur 指向根,parent 为 null;一旦 cur 下移(左或右),parent 就同步赋值为上一步的 cur。这样当 cur 最终为 null 时,parent 正好停在待插入位置的父节点上。
- 若树为空,直接让 root = 新节点,无需 parent 参与
- 若新值小于 cur.val,向左走:parent = cur;cur = cur.left
- 若新值大于等于 cur.val,向右走:parent = cur;cur = cur.right
插入动作只发生在叶子下方:判断空位再挂载
循环结束条件是 cur == null,此时 parent 不为空(除非原树为空,已单独处理)。只需判断新节点值与 parent.val 的大小关系,决定挂在 parent.left 还是 parent.right:
- if (val
- else parent.right = newNode;
注意:BST 允许重复值时通常插入到右子树,也可按需统一丢弃或计数,逻辑在此处收口最干净。
避免空指针与逻辑错位:边界检查要前置
常见错误是未判空就访问 cur.left 或 cur.right,或在循环中错误更新 parent。安全写法是:所有移动操作前先确认 cur 非空;parent 的更新必须紧邻 cur 移动之前;插入前确保 parent 不为 null。
- while (cur != null) { ... }
- parent = cur; // 必须在 cur = cur.left/right 之前执行
- 插入前加 if (parent != null) 冗余但保险(实际循环退出时 parent 已确定非空)
变量命名直指意图:别用 p/q/c 等缩写
用 current 和 parent 比用 c、p 更易读;节点值用 value 而非 val,尤其团队协作时。调试时打印路径也更直观,例如:
"Moving to left of node with value: " + parent.value
- 不推荐:Node p = root, q = null;
- 推荐:TreeNode current = root, parent = null;
- Java 中可配合 Optional.ofNullable 提升空安全意识

















