Skip to content

Commit 1f6c06f

Browse files
committed
feat: add solutions to lcof problem: No.07
面试题07. 重建二叉树
1 parent 280f78a commit 1f6c06f

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed

lcof/面试题07. 重建二叉树/README.md

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,74 @@ function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
224224
}
225225
```
226226

227+
```ts
228+
/**
229+
* Definition for a binary tree node.
230+
* class TreeNode {
231+
* val: number
232+
* left: TreeNode | null
233+
* right: TreeNode | null
234+
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
235+
* this.val = (val===undefined ? 0 : val)
236+
* this.left = (left===undefined ? null : left)
237+
* this.right = (right===undefined ? null : right)
238+
* }
239+
* }
240+
*/
241+
242+
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
243+
if (inorder.length === 0) {
244+
return null;
245+
}
246+
const val = preorder[0];
247+
const i = inorder.indexOf(val);
248+
return new TreeNode(
249+
val,
250+
buildTree(preorder.slice(1, i + 1), inorder.slice(0, i)),
251+
buildTree(preorder.slice(i + 1), inorder.slice(i + 1)),
252+
);
253+
}
254+
```
255+
256+
### **Rust**
257+
258+
```rust
259+
// Definition for a binary tree node.
260+
// #[derive(Debug, PartialEq, Eq)]
261+
// pub struct TreeNode {
262+
// pub val: i32,
263+
// pub left: Option<Rc<RefCell<TreeNode>>>,
264+
// pub right: Option<Rc<RefCell<TreeNode>>>,
265+
// }
266+
//
267+
// impl TreeNode {
268+
// #[inline]
269+
// pub fn new(val: i32) -> Self {
270+
// TreeNode {
271+
// val,
272+
// left: None,
273+
// right: None
274+
// }
275+
// }
276+
// }
277+
use std::rc::Rc;
278+
use std::cell::RefCell;
279+
impl Solution {
280+
pub fn build_tree(preorder: Vec<i32>, inorder: Vec<i32>) -> Option<Rc<RefCell<TreeNode>>> {
281+
if inorder.is_empty() {
282+
return None;
283+
}
284+
let val = preorder[0];
285+
let i = inorder.iter().position(|num| *num == val).unwrap();
286+
Some(Rc::new(RefCell::new(TreeNode {
287+
val,
288+
left: Self::build_tree(preorder[1..i + 1].to_vec(), inorder[..i].to_vec()),
289+
right: Self::build_tree(preorder[i + 1..].to_vec(), inorder[i + 1..].to_vec()),
290+
})))
291+
}
292+
}
293+
```
294+
227295
### **...**
228296

229297
```
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Definition for a binary tree node.
2+
// #[derive(Debug, PartialEq, Eq)]
3+
// pub struct TreeNode {
4+
// pub val: i32,
5+
// pub left: Option<Rc<RefCell<TreeNode>>>,
6+
// pub right: Option<Rc<RefCell<TreeNode>>>,
7+
// }
8+
//
9+
// impl TreeNode {
10+
// #[inline]
11+
// pub fn new(val: i32) -> Self {
12+
// TreeNode {
13+
// val,
14+
// left: None,
15+
// right: None
16+
// }
17+
// }
18+
// }
19+
use std::rc::Rc;
20+
use std::cell::RefCell;
21+
impl Solution {
22+
pub fn build_tree(preorder: Vec<i32>, inorder: Vec<i32>) -> Option<Rc<RefCell<TreeNode>>> {
23+
if inorder.is_empty() {
24+
return None;
25+
}
26+
let val = preorder[0];
27+
let i = inorder.iter().position(|num| *num == val).unwrap();
28+
Some(Rc::new(RefCell::new(TreeNode {
29+
val,
30+
left: Self::build_tree(preorder[1..i + 1].to_vec(), inorder[..i].to_vec()),
31+
right: Self::build_tree(preorder[i + 1..].to_vec(), inorder[i + 1..].to_vec()),
32+
})))
33+
}
34+
}

0 commit comments

Comments
 (0)