1+ /**
2+ * Question Link: https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
3+ * Primary idea: Always use the last element in postorder as root,
4+ * then find that one in inorder to get left and right subtrees
5+ * Time Complexity: O(n), Space Complexity: O(1)
6+ *
7+ * Definition for a binary tree node.
8+ * public class TreeNode {
9+ * public var val: Int
10+ * public var left: TreeNode?
11+ * public var right: TreeNode?
12+ * public init(_ val: Int) {
13+ * self.val = val
14+ * self.left = nil
15+ * self.right = nil
16+ * }
17+ * }
18+ */
19+
20+ class ConstructBinaryTreeInorderPostorder {
21+ func buildTree( inorder: [ Int ] , _ postorder: [ Int ] ) -> TreeNode ? {
22+ guard inorder. count > 0 && postorder. count > 0 && inorder. count == postorder. count else {
23+ return nil
24+ }
25+
26+ return _buildHelper ( inorder, 0 , inorder. count - 1 , postorder, 0 , postorder. count - 1 )
27+ }
28+
29+ private func _buildHelper( inorder: [ Int ] , _ inStart: Int , _ inEnd: Int , _ postorder: [ Int ] , _ postStart: Int , _ postEnd: Int ) -> TreeNode ? {
30+ guard inStart <= inEnd && postStart <= postEnd else {
31+ return nil
32+ }
33+
34+ let root = TreeNode ( postorder [ postEnd] )
35+
36+ var mid = 0
37+ for i in inStart ... inEnd {
38+ if inorder [ i] == root. val {
39+ mid = i
40+ break
41+ }
42+ }
43+
44+ root. left = _buildHelper ( inorder, inStart, mid - 1 , postorder, postStart, mid - 1 - inStart + postStart)
45+ root. right = _buildHelper ( inorder, mid + 1 , inEnd, postorder, mid - inStart + postStart, postEnd - 1 )
46+
47+ return root
48+ }
49+ }
0 commit comments