Program to fill Min-max game tree in Python

Suppose we have a binary tree representing a game state of a two player game. Every internal node is filled with 0 and the leaves values represent the end score. Player 1 wants to maximize the end score while player 2 wants to minimize the end score. Player 1 will always make moves on nodes at even levels and player 2 will always make moves on odd levels. We have to fill in the binary tree with the resulting scores assuming both of players play optimally.
So, if the input is like
then the output will be
To solve this, we will follow these steps −
Define a function helper() . This will take root, h, currentHeight
if root is empty, thenreturn
return
helper(left of root, h, currentHeight + 1)
helper(right of root, h, currentHeight + 1)
if currentHeight < h, thenif currentHeight is even, thenif left of root and right of root are not null, thenvalue of root := maximum of value of left of root, value of right of roototherwise when left of root is not null, thenvalue of root := value of left of roototherwise when right of root is not null, thenvalue of root := value of right of roototherwise,if left of root and right of root are not null, thenvalue of root := minimum of value of left of root, value of right of roototherwise when left of root is not null, thenvalue of root := value of left of roototherwise when right of root is not null, thenvalue of root := value of right of root
if currentHeight is even, thenif left of root and right of root are not null, thenvalue of root := maximum of value of left of root, value of right of roototherwise when left of root is not null, thenvalue of root := value of left of roototherwise when right of root is not null, thenvalue of root := value of right of root
if left of root and right of root are not null, thenvalue of root := maximum of value of left of root, value of right of root
value of root := maximum of value of left of root, value of right of root
otherwise when left of root is not null, thenvalue of root := value of left of root
value of root := value of left of root
otherwise when right of root is not null, thenvalue of root := value of right of root
value of root := value of right of root
otherwise,if left of root and right of root are not null, thenvalue of root := minimum of value of left of root, value of right of roototherwise when left of root is not null, thenvalue of root := value of left of roototherwise when right of root is not null, thenvalue of root := value of right of root
if left of root and right of root are not null, thenvalue of root := minimum of value of left of root, value of right of root
value of root := minimum of value of left of root, value of right of root
otherwise when left of root is not null, thenvalue of root := value of left of root
value of root := value of left of root
otherwise when right of root is not null, thenvalue of root := value of right of root
value of root := value of right of root
Define a function height() . This will take root
if root is null, thenreturn 0
return 0
return 1 + (maximum of height(left of root) , height(right of root))
From the main method, do the following −
h := height(root)
helper(root, h, 0)
return root
Let us see the following implementation to get better understanding −
 Live Demo
class TreeNode:
   def __init__(self, data, left = None, right = None):
      self.val = data
      self.left = left
      self.right = right
class Solution:
   def helper(self, root, h, currentHeight):
      if not root:
         return
         self.helper(root.left, h, currentHeight + 1)
         self.helper(root.right, h, currentHeight + 1)
         if currentHeight < h:
            if currentHeight % 2 == 0:
               if root.left and root.right:
                  root.val = max(root.left.val, root.right.val)
               elif root.left:
                  root.val = root.left.val
               elif root.right:
                  root.val = root.right.val
               else:
                  if root.left and root.right:
                     root.val = min(root.left.val, root.right.val)
                  elif root.left:
                     root.val = root.left.val
                  elif root.right:
                     root.val = root.right.val
   def height(self, root):
      if not root:
         return 0
         return 1 + max(self.height(root.left), self.height(root.right))
   def solve(self, root):
         h = self.height(root)
         self.helper(root, h, 0)
         return root
   def print_tree(root):
      if root is not None:
         print_tree(root.left)
         print(root.val, end = ', ')
      print_tree(root.right)
ob = Solution()
root = TreeNode(0)
root.left = TreeNode(3)
root.right = TreeNode(0)
root.right.left = TreeNode(0)
root.right.right = TreeNode(0)
root.right.left.left = TreeNode(-3)
root.right.right.right = TreeNode(4)
print_tree(ob.solve(root))
root = TreeNode(0)
root.left = TreeNode(3)
root.right = TreeNode(0)
root.right.left = TreeNode(0)
root.right.right = TreeNode(0)
root.right.left.left = TreeNode(-3)
root.right.right.right = TreeNode(4)
3, 3, -3, -3, -3, 4, 4,