C++;AVL树-如何仅使用前序和后序恢复节点输入顺序 我在大学的项目中,我用C++实现了一个带有字符值的AVL树类。我们有一个自动签名器,可以通过随机测试指出我们的错误(如果存在)。我运行了很多次,没有出现错误,这意味着它应该具有OK逻辑。然而,有时我会遇到一个错误,指出我的前序和后序遍历是错误的。这是我得到的实际错误之一: YOUR PREORDER: "IECABDGFHPLKOUSRYX", YOUR POSTORDER: "BADCFHGEKOLRSXYUPI" CORRECT PREORDER: "ECABDOIGFHKLURPSYX", CORRECT POSTORDER: "BADCFHGLKIPSRXYUOE"

C++;AVL树-如何仅使用前序和后序恢复节点输入顺序 我在大学的项目中,我用C++实现了一个带有字符值的AVL树类。我们有一个自动签名器,可以通过随机测试指出我们的错误(如果存在)。我运行了很多次,没有出现错误,这意味着它应该具有OK逻辑。然而,有时我会遇到一个错误,指出我的前序和后序遍历是错误的。这是我得到的实际错误之一: YOUR PREORDER: "IECABDGFHPLKOUSRYX", YOUR POSTORDER: "BADCFHGEKOLRSXYUPI" CORRECT PREORDER: "ECABDOIGFHKLURPSYX", CORRECT POSTORDER: "BADCFHGLKIPSRXYUOE",c++,avl-tree,preorder,postorder,C++,Avl Tree,Preorder,Postorder,是的,这些树仍然是平衡的,但不知怎么的,它们被错误地组合在一起了。我应该如何调试这个?我有一个函数可以用前序和后序重建树,但我认为变量的顺序很重要。否则,我无法知道节点输入的顺序以及我的算法出错的地方。考虑编写您自己的测试引擎,它选择一个随机字符串,运行您的算法并获取它吐出的预排序,按预排序对随机字符串进行排序并比较两者 如果它们不匹配,它将打印随机字符串和两个顺序。 这将帮助您找到失败的预排序测试用例 然后将post order添加到random tester中,并进一步运行它。 您可能能够在

是的,这些树仍然是平衡的,但不知怎么的,它们被错误地组合在一起了。我应该如何调试这个?我有一个函数可以用前序和后序重建树,但我认为变量的顺序很重要。否则,我无法知道节点输入的顺序以及我的算法出错的地方。

考虑编写您自己的测试引擎,它选择一个随机字符串,运行您的算法并获取它吐出的预排序,按预排序对随机字符串进行排序并比较两者

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

然后将post order添加到random tester中,并进一步运行它。 您可能能够在将来的项目中重用此功能


谷歌Fuzzer的其他想法:)

考虑编写您自己的测试引擎,它选择一个随机字符串,通过您的算法运行它,并获得它吐出的前序,按前序对随机字符串排序,并比较两者

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

然后将post order添加到random tester中,并进一步运行它。 您可能能够在将来的项目中重用此功能


Google Fuzzer的其他想法:)

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

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

如果您可以在自动加载器中多次运行代码而不影响您的成绩,则可以使用以下方法获得失败案例的输入

在程序中创建一个伪例程,该例程将按照提供的顺序返回测试输入数据。然后用这个伪函数替换预排序函数。显然,每次测试都会失败,但如果只查看前序和后序都失败的失败情况,则会为失败的后序提供输入


使用real preorder函数重复此过程,并用dummy方法替换post order。

显然,如果根据测试结果,您可以分析代码并找出导致问题的原因,这会更好

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

如果您可以在自动加载器中多次运行代码而不影响您的成绩,则可以使用以下方法获得失败案例的输入

在程序中创建一个伪例程,该例程将按照提供的顺序返回测试输入数据。然后用这个伪函数替换预排序函数。显然,每次测试都会失败,但如果只查看前序和后序都失败的失败情况,则会为失败的后序提供输入

使用real preorder函数重复此过程,并使用dummy方法替换postorder