1#ifndef MERGE_AND_SHRINK_MERGE_TREE_H
2#define MERGE_AND_SHRINK_MERGE_TREE_H
9class RandomNumberGenerator;
12namespace merge_and_shrink {
13extern const int UNINITIALIZED;
21 MergeTreeNode *parent;
22 MergeTreeNode *left_child;
23 MergeTreeNode *right_child;
26 MergeTreeNode() =
delete;
28 MergeTreeNode(
const MergeTreeNode &other);
29 MergeTreeNode(
int ts_index);
30 MergeTreeNode(MergeTreeNode *left_child, MergeTreeNode *right_child);
33 MergeTreeNode *get_left_most_sibling();
34 std::pair<int, int> erase_children_and_set_index(
int new_index);
36 MergeTreeNode *get_parent_of_ts_index(
int index);
37 int compute_num_internal_nodes()
const;
38 void inorder(
int offset,
int current_indentation, utils::LogProxy &log)
const;
40 bool is_leaf()
const {
41 return !left_child && !right_child;
44 bool has_two_leaf_children()
const {
45 return left_child && right_child &&
46 left_child->is_leaf() && right_child->is_leaf();
50enum class UpdateOption {
83 std::shared_ptr<utils::RandomNumberGenerator> rng;
84 UpdateOption update_option;
90 std::pair<MergeTreeNode *, MergeTreeNode *> get_parents_of_ts_indices(
91 const std::pair<int, int> &ts_indices,
int new_index);
96 const std::shared_ptr<utils::RandomNumberGenerator> &rng,
97 UpdateOption update_option);
99 std::pair<int, int> get_next_merge(
int new_index);
104 void update(std::pair<int, int> merge,
int new_index);
107 return root->is_leaf();
110 int compute_num_internal_nodes()
const {
111 return root->compute_num_internal_nodes();
117 void inorder_traversal(
int indentation_offset, utils::LogProxy &log)
const;