以下代码实现了二叉树的( )。
void traverse(TreeNode* root) {
if (!root) return;
traverse(root->left);
traverse(root->right);
cout << root->val << " ";
}根据二叉树的遍历特性,先/前序遍历确定根节点,中序遍历确定左右子树范围,从而重构整棵树,再输出后序遍历结果。
易混淆三种遍历的顺序。先序:根左右;中序:左根右;后序:左右根。注意遍历结果中相邻节点的关系。
【考点】树遍历|递归调用顺序|二叉树后序遍历
🎯 考纲定位 GESP六级“树与递归”模块必考题型,命题人专盯那些背过“左中右”口诀却分不清递归调用顺序的选手——这道题就是卡死对遍历次序理解不深的人。六级大纲明确要求掌握三种递归遍历,但多数考生只记得口诀顺序,没真正理解代码执行流程,遇到变式题就懵。
🧠 解题思维 看到递归函数先调左右子树再输出根节点,立刻锁定“后序遍历”通法——递归调用顺序决定遍历类型:先左后右再根=后序,先根后左右=前序,左根右=中序。这道题的关键是识别cout在两个递归调用之后执行,属于典型的“处理完子节点再处理根”的模板,对应后序遍历的三步骤:遍历左子树→遍历右子树→访问根节点。
🪤 陷阱拆解 A项前序遍历是“根左右”,输出得在递归调用前;B项中序是“左根右”,输出夹在中间;D项层序遍历用队列实现,根本不会递归。命题人把代码顺序打乱,只改了一行cout位置就能区分所有选项,若只记结论不看调用顺序必选错。最阴险的是D项,层序遍历虽然也是二叉树遍历,但实现方式完全不同,用队列按层级访问,不会涉及递归调用,这是利用考生对遍历方式熟悉度的陷阱。
🔄 反命题思维 若把cout移到函数开头,立刻变成前序遍历;若移到左右递归之间,就成中序。刷到递归树题先自问“输出在递归调用哪一步”,这才是命题人想让你建立的思维习惯。