1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| use std::cell::RefCell; use std::collections::HashMap; use std::rc::Rc;
struct Solution;
#[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, } } }
impl Solution { fn build_tree_from_order( hash_map: &HashMap<i32, usize>, preorder: &Vec<i32>, inorder: &Vec<i32>, pre_left: usize, pre_right: usize, in_left: usize, in_right: usize, ) -> Option<Rc<RefCell<TreeNode>>> { if pre_left > pre_right { return None; }
let root_val = preorder[pre_left]; let root = Rc::new(RefCell::new(TreeNode::new(root_val)));
let root_index_inorder = hash_map[&root_val]; let left_tree_size = root_index_inorder - in_left;
root.borrow_mut().left = Solution::build_tree_from_order( hash_map, preorder, inorder, pre_left + 1, pre_left + left_tree_size, in_left, root_index_inorder - 1, );
root.borrow_mut().right = Solution::build_tree_from_order( hash_map, preorder, inorder, pre_left + left_tree_size + 1, pre_right, root_index_inorder + 1, in_right, );
Some(root) }
pub fn build_tree(preorder: Vec<i32>, inorder: Vec<i32>) -> Option<Rc<RefCell<TreeNode>>> { let mut hash_map = HashMap::new(); for (i, &val) in inorder.iter().enumerate() { hash_map.insert(val, i); }
Solution::build_tree_from_order( &hash_map, &preorder, &inorder, 0, preorder.len() - 1, 0, inorder.len() - 1, ) } }
fn main() { let preorder = vec![3, 9, 20, 15, 7]; let inorder = vec![9, 3, 15, 20, 7];
let tree = Solution::build_tree(preorder, inorder); println!("{:?}", tree); }
|