文章
189
粉丝
0
获赞
1
访问
34.0k
int res=10000000;
int dian=0;
void findClose(BSTNode* root,int k){
if(root!=NULL){
if(res>=abs(root,k)){ //若当前节点与K的差的绝对值更小,则更新最小值和节点中的关键字
res=abs(root,k) ;
dian=root->data;
}
if(root->left!=NULL) findClose(root->left,k); //遍历左子树
if(root->right!=NULL) findClose(root->right,k); //遍历右子树
}
cout<<res;
cout<<dian;
(1)计算当前节点关键字与K只差的绝对值,若比最小值res更小,则更新最小值res和节点中的关键字dian,若树的左子树不为空,则遍历他的左子树,若树的右子树不为空,则遍历他的右子树,最后遍历完成,输出最小值res和节点中的关键字dian即可。
评分及理由
(1)得分及理由(满分4分)
得分:2分
理由:学生给出的基本思想描述了遍历二叉树并比较绝对值的过程,但存在以下问题:
1. 没有明确指出利用二叉搜索树中序遍历的递增特性,这是优化算法的关键。
2. 描述中仅提到“若树的左子树不为空,则遍历左子树”,这是一种前序遍历或任意遍历方式,没有利用二叉搜索树的性质,可能导致效率低下。
3. 基本思想不够精确,没有说明如何找到“所有”最小绝对值的结点(学生代码实际上只保存了一个结点,与题目要求不符)。
扣2分:思路不完整,未体现二叉搜索树特性,且未正确处理“所有结点”的要求。
(2)得分及理由(满分8分)
得分:3分
理由:代码存在多处逻辑错误和不符合题目要求的地方:
1. 函数调用错误:abs(root,k) 不是标准库函数,应为 abs(root->data - k)。
2. 遍历方式错误:使用前序遍历(先根后左右)而非中序遍历,无法利用二叉搜索树有序特性提前终止搜索。
3. 只保存一个结点:变量 dian 只保存一个结点的值,但题目要...
登录后发布评论
暂无评论,来抢沙发