similarity_core/
tree.rs

1use std::rc::Rc;
2
3#[derive(Debug, Clone)]
4pub struct TreeNode {
5    pub label: String,
6    pub value: String,
7    pub children: Vec<Rc<TreeNode>>,
8    pub id: usize,
9    pub subtree_size: Option<usize>,
10}
11
12impl TreeNode {
13    #[must_use]
14    pub fn new(label: String, value: String, id: usize) -> Self {
15        TreeNode { label, value, children: Vec::new(), id, subtree_size: None }
16    }
17
18    pub fn add_child(&mut self, child: Rc<TreeNode>) {
19        self.children.push(child);
20    }
21
22    #[must_use]
23    pub fn get_subtree_size(&self) -> usize {
24        // Since we can't mutate through Rc, we'll calculate it each time
25        // In a real implementation, you might want to use RefCell for interior mutability
26        let mut size = 1;
27        for child in &self.children {
28            size += child.get_subtree_size();
29        }
30        size
31    }
32}