把文章下方的代码直接放到题解中,然后就可以方便地把 root: Option<Rc<RefCell>> 转换成 Iterator { Item = Rc<RefCell>; },然后通过 Iterator 的 map 和 collect 功能转换成 Vec。
Iterator 是惰性求值的。
Iterator 采用 DFS,迭代过程中会生成额外的迭代器,有 O(h) 的堆内存消耗。
使用方法
1. 二叉树的前序遍历
impl Solution {
pub fn preorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
let iter = TreeNodeIterator::new(TreeNodeIteratorOrder::PreOrder, root);
iter.map(|node| node.borrow().val).collect()
}
}
2. 二叉树的中序遍历
impl Solution {
pub fn inorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
let iter = TreeNodeIterator::new(TreeNodeIteratorOrder::InOrder, root);
iter.map(|node| node.borrow().val).collect()
}
}
3. 二叉树的后序遍历
impl Solution {
pub fn postorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
let iter = TreeNodeIterator::new(TreeNodeIteratorOrder::PostOrder, root);
iter.map(|node| node.borrow().val).collect()
}
}
TreeNodeIterator
// Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
#[derive