- Fixed rdtree traversers once more, a bug with initializing the queues was causing faulty results. Consider setting up more robust tests.

This commit is contained in:
2025-08-14 21:28:41 -04:00
parent 2535e1ac4b
commit 8bfb59cd20
2 changed files with 62 additions and 34 deletions

View File

@@ -342,27 +342,34 @@ public:
struct pre_order {
list<size_t> visit;
size_t head;
size_t operator()(const rdtree&, size_t start) {
head = start;
return start;
}
size_t operator[](const rdtree& tree, size_t node, uint8_t mode) {
if (node == npos) {
return npos;
}
size_t nxt = tree.next(node);
size_t chd = tree.child(node);
if (nxt != npos && node != head) {
visit.push_front(nxt);
}
if (chd != npos && mode != traversal_control_jump_over) {
visit.push_front(chd);
}
if (not visit.empty()) {
node = visit.front();
visit.pop_front();
} else {
return npos;
}
size_t next = tree.next(node);
if (next != npos) {
visit.push_front(next);
}
size_t child = tree.child(node);
if (child != npos && mode != traversal_control_jump_over) {
visit.push_front(child);
node = npos;
}
return node;
@@ -379,23 +386,28 @@ public:
}
size_t operator[](const rdtree& tree, size_t node, uint8_t) {
if (node == npos) {
return npos;
}
size_t prnt = tree.parent(node);
size_t next = tree.next(node);
if (node != head) {
if (tree.child(prnt) == node) {
visit.push_back(prnt);
if (next != npos) {
visit.push_back(tree.left_most(next));
}
} else if (next != npos) {
visit.push_front(tree.left_most(next));
}
}
if (not visit.empty()) {
node = visit.front();
visit.pop_front();
} else {
return npos;
}
size_t parent = tree.parent(node);
size_t next = tree.next(node);
size_t nnext = next == npos ? npos : tree.next(next);
if (next != npos && node != head) {
if (nnext == npos && parent != npos) {
visit.push_back(parent);
}
visit.push_back(tree.left_most(next));
node = npos;
}
return node;
@@ -412,20 +424,28 @@ public:
}
size_t operator[](const rdtree& tree, size_t node, uint8_t) {
if (node == npos) {
return npos;
}
size_t prnt = tree.parent(node);
size_t next = tree.next(node);
if (node != head) {
if (next != npos) {
visit.push_front(tree.left_most(next));
} else {
visit.push_front(prnt);
}
}
if (not visit.empty()) {
node = visit.front();
visit.pop_front();
} else {
return npos;
node = npos;
}
if (node == head) {
return node;
}
size_t next = tree.next(node);
visit.push_back(next != npos ? tree.left_most(next) : tree.parent(node));
return node;
}
};
@@ -509,7 +529,7 @@ protected:
constexpr void _erase(size_t i) {
list<size_t> queue;
queue.push_back(child(i));
while (queue.empty() == false) {
while (not queue.empty()) {
size_t n = queue.front(); queue.pop_front();
if (n == npos) continue;
queue.push_back(next(n));