| 
 | 1 | +from typing import List  | 
 | 2 | + | 
 | 3 | +# Definition for a binary tree node.  | 
 | 4 | + | 
 | 5 | + | 
 | 6 | +class TreeNode:  | 
 | 7 | + def __init__(self, val=0, left=None, right=None):  | 
 | 8 | + self.val = val  | 
 | 9 | + self.left = left  | 
 | 10 | + self.right = right  | 
 | 11 | + | 
 | 12 | + def __str__(self):  | 
 | 13 | + tree = list()  | 
 | 14 | + queue = list()  | 
 | 15 | + queue.append(self)  | 
 | 16 | + while queue and not all(node is None for node in queue):  | 
 | 17 | + currentNode = queue.pop(0)  | 
 | 18 | + if currentNode is None:  | 
 | 19 | + tree.append(None)  | 
 | 20 | + else:  | 
 | 21 | + tree.append(currentNode.val)  | 
 | 22 | + queue.append(currentNode.left)  | 
 | 23 | + queue.append(currentNode.right)  | 
 | 24 | + return str(tree)  | 
 | 25 | + | 
 | 26 | + | 
 | 27 | +class Solution:  | 
 | 28 | + def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:  | 
 | 29 | + return self.recursiveBuild(0, 0, len(inorder), preorder, inorder)  | 
 | 30 | + | 
 | 31 | + def recursiveBuild(self, preorderIndex: int, inorderStart: int, inorderEnd: int, preorder: List[int], inorder: List[int]) -> TreeNode:  | 
 | 32 | + if inorderStart >= inorderEnd or preorderIndex >= len(preorder):  | 
 | 33 | + return None  | 
 | 34 | + node = TreeNode(preorder[preorderIndex])  | 
 | 35 | + # find index of this node value at inorder  | 
 | 36 | + inorderIndex = inorder.index(preorder[preorderIndex])  | 
 | 37 | + # left node of current node is always next element in preorder (also pass in left subarray range)  | 
 | 38 | + node.left = self.recursiveBuild(  | 
 | 39 | + preorderIndex+1, inorderStart, inorderIndex, preorder, inorder)  | 
 | 40 | + # right node of current node is current node + num of all left nodes + 1  | 
 | 41 | + numLeftNodes = inorderIndex - inorderStart  | 
 | 42 | + node.right = self.recursiveBuild(  | 
 | 43 | + preorderIndex+numLeftNodes+1, inorderIndex+1, inorderEnd, preorder, inorder)  | 
 | 44 | + return node  | 
 | 45 | + | 
 | 46 | + | 
 | 47 | +sol = Solution()  | 
 | 48 | +preorder = [3, 9, 20, 15, 7]  | 
 | 49 | +inorder = [9, 3, 15, 20, 7]  | 
 | 50 | + | 
 | 51 | +root = sol.buildTree(preorder, inorder)  | 
 | 52 | + | 
 | 53 | +print(root)  | 
0 commit comments