use std::fmt::Display; #[derive(Debug)] struct RoseTree<T:Sized + Clone + Display> { value: T, children: Vec<RoseTree<T>> } impl<T> Default for RoseTree<T> where T: Sized + Clone + Display + Default { fn default() -> Self { Self { value: Default::default(), children: Vec::new() } } } impl<T> RoseTree<T> where T: Sized + Clone + Display{ pub fn map<F>(&self, func: F)->Self where F: Fn(&T)-> T { let mut stack = Vec::new(); stack.push((RoseTree{value: func(&self.value), children:vec![]}, self.children.iter())); loop { let top = stack.last_mut().unwrap(); let next = if let Some(it) = top.1.next() { it } else { drop(top); let top = stack.pop().unwrap(); if stack.is_empty() { return top.0; } stack.last_mut().unwrap().0.children.push(top.0); continue; }; stack.push((RoseTree{value: func(&next.value), children: vec![]}, next.children.iter())); } } } fn main() { let t1 = RoseTree { value: 1, children: vec![ RoseTree { value: 2, children: vec![ RoseTree { value: 3, children: vec![ RoseTree { value: 4, children: vec![] }, RoseTree { value: 5, children: vec![] } ] }, RoseTree { value: 6, children: vec![] } ] }, RoseTree { value: 7, children: vec![ RoseTree { value: 8, children: vec![] }, RoseTree { value: 9, children: vec![] } ] }, RoseTree { value: 10, children: vec![ RoseTree { value: 11, children: vec![ RoseTree { value: 12, children: vec![] } ] }, RoseTree { value: 13, children: vec![ RoseTree { value: 14, children: vec![] } ] }, RoseTree { value: 15, children: vec![] } ] } ] }; let t2 = t1.map(|val| val + 3); println!("{:#?}", t2); }


   Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target\debug\rosetree.exe`
RoseTree {
    value: 4,
    children: [
        RoseTree {
            value: 5,
            children: [
                RoseTree {
                    value: 6,
                    children: [
                        RoseTree {
                            value: 7,
                            children: [],
                        },
                        RoseTree {
                            value: 8,
                            children: [],
                        },
                    ],
                },
                RoseTree {
                    value: 9,
                    children: [],
                },
            ],
        },
        RoseTree {
            value: 10,
            children: [
                RoseTree {
                    value: 11,
                    children: [],
                },
                RoseTree {
                    value: 12,
                    children: [],
                },
            ],
        },
        RoseTree {
            value: 13,
            children: [
                RoseTree {
                    value: 14,
                    children: [
                        RoseTree {
                            value: 15,
                            children: [],
                        },
                    ],
                },
                RoseTree {
                    value: 16,
                    children: [
                        RoseTree {
                            value: 17,
                            children: [],
                        },
                    ],
                },
                RoseTree {
                    value: 18,
                    children: [],
                },
            ],
        },
    ],
}

종료 코드 0(으)로 완료된 프로세스