基于第 4 题的定义,有关下面 C++ 代码的说法正确的是( )。
void Order(BiNode* bt) {
if (bt == nullptr)
return;
else {
cout << bt->data;
Order(bt->lchid);
Order(bt->rchid);
}
}拿到题别急着背术语,直接盯住 cout 的位置——根节点先输出,后面跟着左子树、右子树,这就是前序遍历的典型特征,代码里根在递归调用前,答案自然选 B。
学生最容易把‘先根’和‘中序’搞混,因为中序也是先处理左子树再处理根,但中序的根是在中间输出的,而这里根在最前面,所以 A 错;还有人看到递归里有 lchid 就以为是在做中序遍历,其实递归顺序才是关键,代码里先 cout 再递归左再递归右,完全不符合中序的左根右顺序,C 项偷换概念把根挪到左子树后,明显与代码不符;D 项更是把后序的左右根顺序颠倒成左右后根,代码里根在括号外早就输出了,所以 D 也错。
【考点】二叉树遍历|递归调用顺序|前序/中序/后序定义
本题考查《GESP 考试大纲》六级模块中的二叉树遍历知识点。命题人故意混淆前序、中序、后序的定义,用代码顺序卡住只会背术语的考生——他们看到“先根”就以为是中序,看到“先左”就以为是后序,完全没读过递归调用顺序。