Skip to content

Commit 6017e4c

Browse files
committed
solve problem Construct Binary Tree From Preorder And Inorder Traversal
1 parent 2cb6818 commit 6017e4c

File tree

5 files changed

+95
-0
lines changed

5 files changed

+95
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ All solutions will be accepted!
234234
|131|[Palindrome Partitioning](https://leetcode-cn.com/problems/palindrome-partitioning/description/)|[java/py/js](./algorithms/PalindromePartitioning)|Medium|
235235
|60|[Permutation Sequence](https://leetcode-cn.com/problems/permutation-sequence/description/)|[java/py/js](./algorithms/PermutationSequence)|Medium|
236236
|106|[Construct Binary Tree From Inorder And Postorder Traversal](https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/)|[java/py/js](./algorithms/ConstructBinaryTreeFromInorderAndPostorderTraversal)|Medium|
237+
|105|[Construct Binary Tree From Preorder And Inorder Traversal](https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/)|[java/py/js](./algorithms/ConstructBinaryTreeFromPreorderAndInorderTraversal)|Medium|
237238

238239
# Database
239240
|#|Title|Solution|Difficulty|
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Construct Binary Tree From Preorder And Inorder Traversal
2+
We can solve this problem by recursion
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode(int x) { val = x; }
8+
* }
9+
*/
10+
class Solution {
11+
public TreeNode buildTree(int[] preorder, int[] inorder) {
12+
return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
13+
}
14+
15+
public TreeNode build(int[] preorder, int preBeg, int preEnd, int[] inorder, int inBeg, int inEnd) {
16+
if (inBeg > inEnd) return null;
17+
18+
TreeNode root = new TreeNode(preorder[preBeg]);
19+
int pos = -1;
20+
21+
for (int i = inBeg; i <= inEnd; i++) {
22+
if (preorder[preBeg] == inorder[i]) {
23+
pos = i;
24+
break;
25+
}
26+
}
27+
28+
root.left = build(preorder, preBeg + 1, preBeg + pos - inBeg, inorder, inBeg, pos - 1);
29+
root.right = build(preorder, preBeg + pos - inBeg + 1, preEnd, inorder, pos + 1, inEnd);
30+
31+
return root;
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* function TreeNode(val) {
4+
* this.val = val;
5+
* this.left = this.right = null;
6+
* }
7+
*/
8+
/**
9+
* @param {number[]} preorder
10+
* @param {number[]} inorder
11+
* @return {TreeNode}
12+
*/
13+
var buildTree = function(preorder, inorder) {
14+
return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1)
15+
};
16+
17+
var build = function(preorder, preBeg, preEnd, inorder, inBeg, inEnd) {
18+
if (inBeg > inEnd) {
19+
return null
20+
}
21+
22+
let root = new TreeNode(preorder[preBeg]),
23+
pos = inorder.indexOf(preorder[preBeg])
24+
25+
pos = inBeg <= pos && pos <= inEnd ? pos : -1
26+
27+
root.left = build(preorder, preBeg + 1, preBeg + pos - inBeg, inorder, inBeg, pos - 1)
28+
root.right = build(preorder, preBeg + pos - inBeg + 1, preEnd, inorder, pos + 1, inEnd)
29+
30+
return root
31+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode(object):
3+
# def __init__(self, x):
4+
# self.val = x
5+
# self.left = None
6+
# self.right = None
7+
8+
class Solution(object):
9+
def buildTree(self, preorder, inorder):
10+
"""
11+
:type preorder: List[int]
12+
:type inorder: List[int]
13+
:rtype: TreeNode
14+
"""
15+
return self.build(preorder, 0, len(preorder) - 1, inorder, 0, len(inorder) - 1)
16+
17+
def build(self, preorder, pre_beg, pre_end, inorder, in_beg, in_end):
18+
if in_beg > in_end:
19+
return None
20+
21+
root = TreeNode(preorder[pre_beg])
22+
pos = inorder.index(preorder[pre_beg])
23+
pos = pos if in_beg <= pos <= in_end else -1
24+
25+
root.left = self.build(preorder, pre_beg + 1, pre_beg + pos - in_beg, inorder, in_beg, pos - 1)
26+
root.right = self.build(preorder, pre_beg + pos - in_beg + 1, pre_end, inorder, pos + 1, in_end)
27+
28+
return root

0 commit comments

Comments
 (0)