#![allow(dead_code, deprecated, unused_variables, unused_mut)] use std::ops::ControlFlow; pub struct TreeNode { value: T, left: Option>>, right: Option>>, } impl TreeNode { pub fn traverse_inorder( &self, f: &mut impl FnMut(&T) -> ControlFlow, ) -> ControlFlow { if let Some(left) = &self.left { left.traverse_inorder(f)?; } f(&self.value)?; if let Some(right) = &self.right { right.traverse_inorder(f)?; } ControlFlow::Continue(()) } fn leaf(value: T) -> Option>> { Some( Box::new(Self { value, left: None, right: None, }), ) } } fn main() { let node = TreeNode { value: 0, left: TreeNode::leaf(1), right: Some( Box::new(TreeNode { value: -1, left: TreeNode::leaf(5), right: TreeNode::leaf(2), }), ), }; let mut sum = 0; let res = node .traverse_inorder( &mut |val| { if *val < 0 { ControlFlow::Break(*val) } else { sum += *val; ControlFlow::Continue(()) } }, ); assert_eq!(res, ControlFlow::Break(- 1)); assert_eq!(sum, 6); }