以下代码实现了二叉树的哪种遍历方式?
void traverse(TreeNode* root) {
if (root == nullptr) return;
cout << root->val << " ";
traverse(root->left);
traverse(root->right);
}根据二叉树的遍历特性,先/前序遍历确定根节点,中序遍历确定左右子树范围,从而重构整棵树,再输出后序遍历结果。
易混淆三种遍历的顺序。先序:根左右;中序:左根右;后序:左右根。注意遍历结果中相邻节点的关系。
【考点】二叉树遍历|递归调用顺序|前序中序后序区分
1. 🎯 考纲定位 考查《GESP 六级大纲》算法模块核心的二叉树遍历知识。命题人放这道题不是为了考背诵,而是卡住 80% 考生对"先处理根节点"这一顺序的敏感度——很多人死记"左中右"口诀却分不清递归调用顺序,以为只要包含左右子树就是中序,这是典型的顺序感缺失。
2. 🧠 解题思维 解题核心是识别递归调用的顺序:代码先输出根节点值,再递归左子树,最后递归右子树,对应"根-左-右"的固定模式。这是前序遍历的标志性特征,与中序(左-根-右)和后序(左-右-根)形成严格区分。通法是看递归函数体内的操作序列,哪个位置处理当前节点就决定遍历类型。
3. 🪤 陷阱拆解 选项 B 中序的陷阱在于"左-根-右"口诀,但代码先输出根再递归左,顺序完全相反;选项 C 后序陷阱是"左-右-根",而代码根在前、左右在后。D 层序更隐蔽,它考察递归 vs 队列,但代码明显是递归调用而非循环,层序必须用队列实现。最阴险的是"左右顺序"——代码先左后右,若改成先右后左就是反向前序,命题人用这个细节筛掉死记硬背的人。
4. 🔄 反命题思维 反命题角度:若把递归调用顺序交换,代码变为"根-右-左"反向前序;若把输出移到两个递归调用之间,就是中序;移到最后则成后序。这提醒我们,遍历类型完全由"处理当前节点"与"递归调用"的先后顺序决定,而非节点内容。