C++AVL树-如何仅使用预订单和后订单恢复节点输入订单



对于我在大学的项目,我正在用C++实现一个AVL树类,其中包含值的字符。我们有一个自动标记器,如果有随机测试,它会指出我们的错误。我运行了很多次,没有出现任何错误,这意味着它应该具有OK逻辑。然而,有时我会出错,说我的预购和后购遍历是错误的。这是我得到的一个实际错误:

YOUR PREORDER: "IECABDGFHPLKOUSRYX", YOUR POSTORDER: "BADCFHGEKOLRSXYUPI" 
CORRECT PREORDER: "ECABDOIGFHKLURPSYX", CORRECT POSTORDER: "BADCFHGLKIPSRXYUOE"

是的,这些树仍然是平衡的,但不知怎么地放错了。我应该如何调试它?我有一个函数可以使用前序和后序重建树,但我认为把变量放在事物中的顺序。否则,我无法知道节点输入的顺序以及我的算法哪里出了问题。

考虑编写自己的测试引擎,它会挑选一个随机字符串,通过算法运行它,得到它抛出的预订单,按预订单对随机字符串进行排序,并将两者进行比较。

如果它们不匹配,它会打印随机字符串和两个订单。这应该可以帮助您找到失败的预购测试用例。

然后将post-order添加到随机测试仪中,再运行一些。您也许可以在将来的项目中重用它。

谷歌Fuzzer的其他想法:(

显然,如果给出测试结果,您可以分析代码并找出问题的原因,那会更好。

但有时从黑盒系统中提取更多信息也是有用的。以下是一种可能适用于您的情况的方法。

如果你可以多次通过自动评分器运行代码而不影响你的成绩,那么你可以使用以下方法获得失败案例的输入。

在程序中制作一个伪例程,该例程将按提供的顺序返回测试输入数据。然后用这个伪函数替换预购函数。显然,这将使每个测试都失败,但如果您只查看预购和后购都失败的失败,这将为失败的后购提供输入。

使用实预序函数重复此过程,并用伪方法替换后序。

最新更新