DeepRest

Construct Binary Tree from Inorder and Postorder Traversal

Nov 21st, 2021 (edited)
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.51 KB | None | 0 0
  1. #O(N) worst case solution with right subtree construction first
  2.  
  3. # Definition for a binary tree node.
  4. # class TreeNode(object):
  5. #     def __init__(self, val=0, left=None, right=None):
  6. #         self.val = val
  7. #         self.left = left
  8. #         self.right = right
  9. class Solution(object):
  10.     def buildTree(self, inorder, postorder):
  11.         """
  12.        :type inorder: List[int]
  13.        :type postorder: List[int]
  14.        :rtype: TreeNode
  15.        """
  16.         inorder = {val: i for i, val in enumerate(inorder)}
  17.  
  18.         def construct(beg, end):
  19.             if end - beg < 0:
  20.                 return None
  21.            
  22.             root = postorder.pop()
  23.             idx = inorder[root]
  24.             node = TreeNode(root)
  25.  
  26.             node.right = construct(idx+1, end)
  27.             node.left = construct(beg, idx-1)
  28.             return node
  29.  
  30.         root = construct(0, len(inorder)-1)
  31.         return root  
  32. """
  33. Alternative AC Solutions:
  34. O(N) worst case with left subtree construction first
  35.  
  36. # Definition for a binary tree node.
  37. # class TreeNode(object):
  38. #     def __init__(self, val=0, left=None, right=None):
  39. #         self.val = val
  40. #         self.left = left
  41. #         self.right = right
  42. class Solution(object):
  43.    def buildTree(self, inorder, postorder):
  44.  
  45.        inorder = {val: i for i, val in enumerate(inorder)}
  46.  
  47.        def construct(ibeg, iend, pbeg, pend):
  48.            if iend - ibeg < 0:
  49.                return None
  50.  
  51.            root = postorder[pend]
  52.            idx = inorder[root]
  53.            node = TreeNode(root)
  54.  
  55.        #left = idx - ibeg
  56.        #right = iend - idx
  57.  
  58.            node.left = construct(ibeg, idx-1, pbeg, pbeg + idx - ibeg - 1)
  59.            node.right = construct(idx+1, iend, pend-iend + idx, pend-1)
  60.            return node
  61.  
  62.        root = construct(0, len(inorder)-1, 0, len(postorder)-1)
  63.        return root
  64.        
  65. O(N2) worst case
  66.  
  67. class Solution(object):
  68.    def buildTree(self, inorder, postorder):
  69.      
  70.        pOrder = {val: i for i, val in enumerate(postorder)}
  71.  
  72.        def construct(iOrder):
  73.            if len(iOrder) == 0:
  74.                return None
  75.  
  76.            maxidx = 0
  77.            for i, e in enumerate(iOrder):
  78.                if pOrder[e] > pOrder[iOrder[maxidx]]:
  79.                    maxidx = i
  80.            node = TreeNode(iOrder[maxidx])
  81.  
  82.            node.left = construct(iOrder[:maxidx])
  83.            node.right = construct(iOrder[maxidx+1:])
  84.            return node
  85.  
  86.        root = construct(inorder)
  87.        return root
  88. """
Add Comment
Please, Sign In to add comment