// 定义树节点
struct TreeNode<T> {
value: T,
children: Vec<TreeNode<T>>,
}
// 定义TreeTraversal特征
trait TreeTraversal<T> {
fn pre_order_traversal(&self);
fn in_order_traversal(&self);
fn post_order_traversal(&self);
}
// 实现TreeTraversal特征
impl<T> TreeTraversal<T> for TreeNode<T> {
fn pre_order_traversal(&self) {
println!("{:?}", self.value);
for child in &self.children {
child.pre_order_traversal();
}
}
fn in_order_traversal(&self) {
if!self.children.is_empty() {
self.children[0].in_order_traversal();
}
println!("{:?}", self.value);
for i in 1..self.children.len() {
self.children[i].in_order_traversal();
}
}
fn post_order_traversal(&self) {
for child in &self.children {
child.post_order_traversal();
}
println!("{:?}", self.value);
}
}
生命周期问题处理说明
- 特征定义:在
TreeTraversal
特征定义中,由于方法参数是&self
,这表明方法接受一个对树节点的不可变借用。这意味着这些方法不会改变树的结构,所以生命周期的范围是在借用期间。
- 遍历方法实现:在
pre_order_traversal
、in_order_traversal
和post_order_traversal
方法实现中,通过&self.children
来访问子节点。这里&self
的生命周期涵盖了对children
的借用以及递归调用子节点的遍历方法,所以生命周期管理是隐式且安全的。因为 Rust 的借用检查器会确保在这些方法执行期间,借用的树节点不会被释放,从而避免了悬垂引用等生命周期相关的错误。