常见错误
错误 1: 缺少 Base Case (无限递归)
错误表现:
PROCEDURE InOrder(Index)
CALL InOrder(Tree[Index][1])
OUTPUT Tree[Index][0]
CALL InOrder(Tree[Index][2])
ENDPROCEDURE
后果: 当 Index = -1 时依然递归, 访问 Tree[-1] 导致数组越界 → runtime error
正解: 每次进入递归先检查空节点:
IF Index = -1 THEN RETURN
错误 2: 遍历顺序混淆
错误表现: 题目要求 in-order (左根右), 写成 pre-order (根左右) 或 post-order (左右根)
正解:
- In-order: 左递归 → OUTPUT → 右递归
- Pre-order: OUTPUT → 左递归 → 右递归
- Post-order: 左递归 → 右递归 → OUTPUT
记忆口诀: "左根右是 in-order, 根左右是 pre-order, 左右根是 post-order"
错误 3: 2D Array 列索引错误
错误表现:
OUTPUT Tree[Index][1] // 写成了 Left 列
CALL InOrder(Tree[Index][0]) // 写成了 Data 列
正解: 明确数组列含义 — Tree[Index][0] = Data, Tree[Index][1] = Left, Tree[Index][2] = Right
错误 4: OOP 中 Null 检查错误
错误表现:
IF CurrentNode <> -1 THEN // 用 -1 而非 NULL 检查对象
正解: 对象引用使用 NULL, 数组索引使用 -1
IF CurrentNode <> NULL THEN
错误 5: OOP 中直接访问私有属性
错误表现:
OUTPUT CurrentNode.Data // Data 是 PRIVATE
正解: 使用 Getter 方法访问:
OUTPUT CurrentNode.GetData()
错误 6: 硬编码起始索引而非使用 RootPointer
错误表现:
CALL InOrder(0) // 假设根总是在 0
正解:
CALL InOrder(RootPointer) // 从根节点开始
错误 7: 递归参数错误 (传值而非传引用)
错误表现: 在递归过程中修改了参数值, 导致回溯时参数错误
正解: 递归参数应作为输入值, 不在过程中修改
错误 8: 混淆 IF 包裹 vs IF RETURN
两种写法均可, 但易犯错误:
// 写法 A (推荐): 先检查空节点再执行
IF Index = -1 THEN RETURN
// 执行递归逻辑
// 写法 B: 用条件包裹
IF Index <> -1 THEN
// 递归逻辑
ENDIF
注意: 写法 B 中不能有 ELSE 分支干扰主逻辑