92#ifndef HUFFMAN_BTREEPIC_H
93#define HUFFMAN_BTREEPIC_H
188inline const long double offset[] = { 10, 15, 25, 40, 55, 65, 85, 90 };
333 const std::string & key = p->
get_key().first;
358 else if (key ==
"\\")
362 else if (key ==
"\"")
377 return std::to_string(n).size();
427 const std::string &
kp = p->
get_key().first;
Huffman coding for data compression.
Node for binary search tree.
void empty() noexcept
empty the list
Generic key-value map implemented on top of a binary search tree.
Pair * insert(const Key &key, const Data &data)
Insert a key-value pair.
Data & find(const Key &key)
Find the value associated with key.
const size_t & size() const
Returns the cardinality of the set.
void empty()
remove all elements from the set
size_t size() const noexcept
Count the number of elements of the list.
int preOrderRec(Node *root, void(*visitFct)(Node *, int, int))
Traverse recursively in preorder a binary tree.
constexpr Node *& RLINK(Node *p) noexcept
Return the right tree of p.
void levelOrder(Node *root, void(*visitFct)(Node *, int, bool))
Traverse a binary tree by levels.
int inOrderRec(Node *root, void(*visitFct)(Node *, int, int))
Traverse recursively inorder a binary tree.
constexpr Node *& LLINK(Node *p) noexcept
Return a pointer to left subtree.
void reset_huffman_btreepic_state() noexcept
Reset global state for a new tree processing.
Freq_Node * pred
Predecessor node in level-order traversal.
void write_freq(Freq_Node *p, int level, int pos)
Write node frequency value.
void save_level_pos_1(Freq_Node *p, int pos, bool is_left)
First pass level-order callback: record child direction.
long double get_offset(size_t index) noexcept
Get safe offset value with bounds checking.
void adjust_nodes(Freq_Node *p, int p_level, int p_infix_pos)
Adjust node positions to prevent label overlap.
void write_prefix(Freq_Node *p, int level, int prefix_pos)
Write node position in prefix order.
Offset
Horizontal offset direction for node label adjustment.
@ NO_OFFSET
No offset applied.
@ LEFT
Shifted to the left.
@ RIGHT
Shifted to the right.
size_t num_digits(const int &n)
Compute number of decimal digits in an integer.
DynMapTree< Freq_Node *, Infix_Desc, Treap > infix_table
Map from node pointer to infix position descriptor.
int minimal_gap
Minimum gap (in nodes) before applying offset adjustment.
void huffman_to_btreepic(Freq_Node *p, const bool with_level_adjust=false)
Generate btreepic specification for a Huffman tree.
std::ostream * output_ptr
Output stream pointer for btreepic commands.
constexpr size_t MAX_OFFSET_INDEX
Maximum valid index for offset array.
const long double offset[]
Offset values indexed by symbol string length (bounded by MAX_OFFSET_INDEX)
Level_Table level_table
Map from node pointer to level traversal descriptor.
void save_level_pos_2(Freq_Node *p, int pos, bool is_left)
Second pass level-order callback: link successors.
void save_infix_pos(Freq_Node *p, int level, int pos)
Save infix position for a node.
void write_leaves(Freq_Node *p, int level, int pos)
Write leaf node labels with LaTeX escaping.
DynList< T > maps(const C &c, Op op)
Classic map operation.
Descriptor for infix (in-order) traversal position.
Offset offset
Applied offset direction.
int level
Tree level (0 = root)
Infix_Desc()
Default constructor.
int pos
In-order position (0-based)
Infix_Desc(int i, int l)
Construct with position and level.
Descriptor for level-order traversal information.
Level_Desc(bool il, Freq_Node *succ=nullptr)
Construct with child direction and optional successor.
bool is_left
True if this node is a left child.
Level_Desc()=default
Default constructor.
Freq_Node * level_succ
Next node in level-order traversal.
Dynamic key-value map based on balanced binary search trees.