Rework binary tree to use indexes in nodes vector
An index is a pointer, and they don't change if the vector decides to reallocate internally unlike the bastardised pointers I was rolling up before. This simplifies design a bit.
This commit is contained in:
40
src/main.cpp
40
src/main.cpp
@@ -78,9 +78,9 @@ struct Fraction
|
|||||||
struct Node
|
struct Node
|
||||||
{
|
{
|
||||||
Fraction value;
|
Fraction value;
|
||||||
Node *left, *right;
|
int64_t left, right;
|
||||||
|
|
||||||
Node(Fraction val, Node *left = nullptr, Node *right = nullptr)
|
Node(Fraction val, int64_t left = -1, int64_t right = -1)
|
||||||
: value{val}, left{left}, right{right}
|
: value{val}, left{left}, right{right}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@@ -88,34 +88,34 @@ struct Node
|
|||||||
|
|
||||||
std::vector<Node> nodes;
|
std::vector<Node> nodes;
|
||||||
|
|
||||||
Node *alloc_node(Node n)
|
word_t alloc_node(Node n)
|
||||||
{
|
{
|
||||||
nodes.push_back(n);
|
nodes.push_back(n);
|
||||||
return nodes.data() + (nodes.size() - 1);
|
return nodes.size() - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::queue<Node *> to_iterate;
|
std::queue<word_t> to_iterate;
|
||||||
|
|
||||||
void iterate(void)
|
void iterate(void)
|
||||||
{
|
{
|
||||||
if (to_iterate.empty())
|
if (to_iterate.empty())
|
||||||
return;
|
return;
|
||||||
Node *node = to_iterate.front();
|
word_t index = to_iterate.front();
|
||||||
|
if (nodes[index].left == -1)
|
||||||
|
{
|
||||||
|
nodes[index].left = alloc_node(Fraction{
|
||||||
|
nodes[index].value.numerator,
|
||||||
|
nodes[index].value.numerator + nodes[index].value.denominator});
|
||||||
|
}
|
||||||
|
if (nodes[index].right == -1)
|
||||||
|
{
|
||||||
|
nodes[index].right = alloc_node(
|
||||||
|
Fraction{nodes[index].value.numerator + nodes[index].value.denominator,
|
||||||
|
nodes[index].value.denominator});
|
||||||
|
}
|
||||||
to_iterate.pop();
|
to_iterate.pop();
|
||||||
if (!node->left)
|
to_iterate.push(nodes[index].left);
|
||||||
{
|
to_iterate.push(nodes[index].right);
|
||||||
node->left =
|
|
||||||
alloc_node(Fraction{node->value.numerator,
|
|
||||||
node->value.numerator + node->value.denominator});
|
|
||||||
}
|
|
||||||
else if (!node->right)
|
|
||||||
{
|
|
||||||
node->right =
|
|
||||||
alloc_node(Fraction{node->value.numerator + node->value.denominator,
|
|
||||||
node->value.denominator});
|
|
||||||
}
|
|
||||||
to_iterate.push(node->left);
|
|
||||||
to_iterate.push(node->right);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
|
|||||||
Reference in New Issue
Block a user