【发布时间】:2020-09-22 08:14:06
【问题描述】:
我无法理解我的函数中缺少的东西来填充二叉树与手动输入。 打印头部值及其左右节点值似乎对我也没有帮助,因为它看起来对我来说是正确的。但是,在自动填充后打印出所有值会产生奇怪的结果。
这个二叉树的值将来自一个数组:
std::vector<ValueType> values = {
3,
7,4,
2,4,6,
8,5,9,3
};
这是树关系:
3
(7,4)
7 4
(2,4) (4,6)
2 4 6
(8,5) (5,9) (9,3)
如您所见,父节点位于上方,其子节点位于下方,用括号括起来。
row1: the root node 3 have left:7, right:4
row2: parent 7 have left:2, right:4
row2: parent 4 have left:4, right:6
...
这似乎不是 cmets 中提到的二叉树,而是将其视为具有空左或右节点的树或具有来自其兄弟(同一行)的共享子节点的树。
下面是自动填充二叉树的函数:
// ValueType is defined as an alias of int
void populateTree(BinaryTree* node, int rowCount, int lastIndex, std::vector<ValueType> values) {
for (int i = 0; i < rowCount; ++i) {
iterCount++;
int currentRow = (i * (i + 1)) / 2;
int x = i + 1;
int nextRow = (x * (x + 1)) / 2;
bool toggle = false;
for (int j = nextRow; j < nextRow + x; ++j) {
auto value = values[currentRow++];
node->value = node->parent != nullptr ? value : node->value;
if (j >= values.size())
continue;
auto leftValue = values[j + 0];
auto rightValue = values[j + 1];
node->left = new BinaryTree(node, leftValue);
node->right = new BinaryTree(node, rightValue);
if (j != currentRow)
std::cout << ", ";
std::cout << node->value << "(" << node->left->value << "," << node->right->value << ")";
node = toggle ? node->right : node->left;
toggle = !toggle;
}
std::cout << std::endl;
}
}
我已使用triangular number formula 将数组映射为行和列。
现在,要确认代码是否正常工作,从下面三角形的顶部开始,移动到下一行的相邻数字,从上到下的最大总数应为 23。
我通过自底向上遍历并添加所有相邻节点组合来完成此操作。这是结果的输出:
3(7,4)
7(2,4), 4(4,6)
2(8,5), 4(5,9), 6(9,3)
iter count: 14
============
[4, 4, 7, 3]:18
[5, 4, 2, 4, 7, 3]:25
[3, 6, 4, 2, 4, 7, 3]:29
[3, 6, 4, 2, 4, 7, 3]:29
[5, 2, 4, 7, 3]:21
[4, 7, 3]:14
[4, 3]:7
pair total sum: 54
应该有[n1, n2, n3, ...nX]:23的组合。
但是,如果我手动构建二叉树,则有正确的组合:
3(7,4)
7(2,4), 4(4,6)
2(8,5), 4(5,9), 6(9,3)
iter count: 14
============
[8, 2, 7, 3]:20
[5, 2, 7, 3]:17
[5, 4, 7, 3]:19
[9, 4, 7, 3]:23 <--- this is the correct combination.
[5, 4, 4, 3]:16
[9, 4, 4, 3]:20
[9, 6, 4, 3]:22
[3, 6, 4, 3]:16
pair total sum: 83
完整源代码链接:https://gist.github.com/mr5z/8249a9101e5bfdce4850602c3ea7ebf3
这是我对project euler#18的解决方案的一部分
【问题讨论】:
-
请在问题中包含minimal reproducible example
-
您是否尝试过使用调试器逐句执行代码语句,同时监视变量及其值,以查看何时何地没有按预期发生?
-
@idclev463035818 我已将源代码链接减少到 151 行。够了吗?
-
@Someprogrammerdude 是的。我总是使用调试器。我很难掌握我在代码中遗漏了什么,而不是我错过了希望在调试器中看到的值。
标签: c++ binary-tree