我为此撰写的代码:
sumBST(BST *root)
{
static sum =0;
if (root!= null)
{
if (root->left != null || root->right != null)
{
sum = sum + sumBST(root->left) + sumBST(root->right);
return sum;
}
else
{
root->data;
}
}
else
{
return 0;
}
return sum;
}
我通过绘制递归树来检查它似乎很好但是我仍然感到困惑,我在做某些错误。请纠正我,我在这里做错了。
答案 0 :(得分:1)
嗯,好像你实际上并没有添加叶子节点的总和。
在parcticular - 线:
root->data
实际上不会返回数据,只是读取它。 在伪代码中应该是类似的东西:
sumBST(node):
if (root == null):
return 0
else if (root->left == null && root->right == null)
//add the value of the node if it is a leaf, this step is missing
return root->data;
else:
return sumBST(root->left) + sumBST(root->right)
修改强>
代码中的问题如下(澄清并进一步解释答案中的这一点):
你应该在某处返回叶子的数据 - 这不会发生在代码中的任何地方 - 我怀疑你想在root->data
中返回它。
但请注意,递归将转到每个叶子 - 它只是缺少从每个叶子返回值。
答案 1 :(得分:1)
这个问题的目的主要集中在评估候选人思维过程。
我在这里看到的只是拼写错误
root->data => return root->data
以及从未到过的指令
return sum;
和一个过长的指令
sum = sum + sumBST(root->left) + sumBST(root->right); => return sumBST(root->left) + sumBST(root->right);
采访者总是喜欢质疑他们给出的问题。 一个问题,比如“BST是给定的,还是我可以设计一个针对给定叶片总和而优化的结构?”,“BST有多大?”......可以添加一个加号,最有可能完全改变你的答案。