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

问题描述

对于我在大学里的项目,我正在用C ++实现一个带有值字符的AVL树类。我们有一个自动分级机,可以指出随机测试中的错误(如果存在)。我多次运行它很多次,并且没有错误,这意味着它应该具有确定的逻辑。但是,有时我会收到一条错误消息,指出我的预订和遍历遍历是错误的。这是我收到的实际错误之一:

YOUR PREORDER: "IECABDGFHPLKOUSRYX",YOUR postorder: "BADCFHGEKOlrsXYUPI" 
CORRECT PREORDER: "ECABDOIGFHKLURPSYX",CORRECT postorder: "BADCFHGLKIPSRXYUOE"

是的,这些树仍然平衡,但是以某种方式错误地组合在一起。我应该如何调试呢?我有一个可以使用前序和后序重构树的函数,但是我认为将变量放入事物的顺序。否则,我无法知道节点输入的顺序以及算法出错的地方。

解决方法

考虑编写您自己的测试引擎,该引擎会选择一个随机字符串,通过您的算法运行它,并获得它发出的预排序,按预排序对随机字符串进行排序,然后将两者进行比较。

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

然后将后置订单添加到随机测​​试仪,然后再运行它。 您也许可以在以后的项目中重用它。

Google Fuzzer还有其他建议:)

,

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

但是有时从黑匣子系统中提取更多信息也很有用。这是一种可能适合您的情况的方法。

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

在程序中创建一个虚拟例程,该例程将按提供的顺序返回测试输入数据。然后用该虚拟功能替换您的预订功能。显然,这将使每个测试失败,但是,如果您仅查看预购和后购均失败的失败,则将为失败的后购提供输入。

使用真正的预订功能重复此过程,并用哑元方法替换后订单。