22 * [106] Construct Binary Tree from Inorder and Postorder Traversal
33 *
44 * Given inorder and postorder traversal of a tree, construct the binary tree.
5- *
5+ *
66 * Note:<br />
77 * You may assume that duplicates do not exist in the tree.
8- *
8+ *
99 * For example, given
10- *
11- *
10+ *
11+ *
1212 * inorder = [9,3,15,20,7]
1313 * postorder = [9,15,7,20,3]
14- *
14+ *
1515 * Return the following binary tree:
16- *
17- *
16+ *
17+ *
1818 * 3
1919 * / \
2020 * 9 20
2121 * / \
2222 * 15 7
23- *
24- *
23+ *
24+ *
2525 */
2626pub struct Solution { }
27- use super :: util:: tree:: { TreeNode , to_tree } ;
27+ use super :: util:: tree:: { to_tree , TreeNode } ;
2828
2929// submission codes start here
3030
31- use std:: rc:: Rc ;
3231use std:: cell:: RefCell ;
32+ use std:: rc:: Rc ;
3333impl Solution {
3434 pub fn build_tree ( inorder : Vec < i32 > , postorder : Vec < i32 > ) -> Option < Rc < RefCell < TreeNode > > > {
35- Solution :: build_tree_helper ( & postorder[ ..] , & inorder[ ..] , )
35+ Solution :: build_tree_helper ( & postorder[ ..] , & inorder[ ..] )
3636 }
3737
3838 fn build_tree_helper ( postorder : & [ i32 ] , inorder : & [ i32 ] ) -> Option < Rc < RefCell < TreeNode > > > {
39- if postorder. is_empty ( ) { return None }
40- let root_idx = inorder. iter ( ) . position ( |v| v == postorder. last ( ) . unwrap ( ) ) . unwrap ( ) ;
41- Some ( Rc :: new ( RefCell :: new ( TreeNode {
39+ if postorder. is_empty ( ) {
40+ return None ;
41+ }
42+ let root_idx = inorder
43+ . iter ( )
44+ . position ( |v| v == postorder. last ( ) . unwrap ( ) )
45+ . unwrap ( ) ;
46+ Some ( Rc :: new ( RefCell :: new ( TreeNode {
4247 val : * postorder. last ( ) . unwrap ( ) ,
4348 left : Solution :: build_tree_helper ( & postorder[ 0 ..root_idx] , & inorder[ 0 ..root_idx] ) ,
44- right : Solution :: build_tree_helper ( & postorder[ root_idx..postorder. len ( ) -1 ] , & inorder[ root_idx+1 ..] ) ,
49+ right : Solution :: build_tree_helper (
50+ & postorder[ root_idx..postorder. len ( ) - 1 ] ,
51+ & inorder[ root_idx + 1 ..] ,
52+ ) ,
4553 } ) ) )
4654 }
4755}
@@ -54,8 +62,14 @@ mod tests {
5462
5563 #[ test]
5664 fn test_106 ( ) {
57- assert_eq ! ( Solution :: build_tree( vec![ 9 , 3 , 15 , 20 , 7 ] , vec![ 9 , 15 , 7 , 20 , 3 ] ) , tree![ 3 , 9 , 20 , null, null, 15 , 7 ] ) ;
58- assert_eq ! ( Solution :: build_tree( vec![ 3 , 20 , 7 ] , vec![ 7 , 20 , 3 ] ) , tree![ 3 , null, 20 , null, 7 ] ) ;
65+ assert_eq ! (
66+ Solution :: build_tree( vec![ 9 , 3 , 15 , 20 , 7 ] , vec![ 9 , 15 , 7 , 20 , 3 ] ) ,
67+ tree![ 3 , 9 , 20 , null, null, 15 , 7 ]
68+ ) ;
69+ assert_eq ! (
70+ Solution :: build_tree( vec![ 3 , 20 , 7 ] , vec![ 7 , 20 , 3 ] ) ,
71+ tree![ 3 , null, 20 , null, 7 ]
72+ ) ;
5973 assert_eq ! ( Solution :: build_tree( vec![ ] , vec![ ] ) , tree![ ] ) ;
6074 }
6175}
0 commit comments