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(으)로 완료된 프로세스
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);
}
멋지게 풀었네요