def test_tree_nodes(self):
     t1 = tree_node(None, None, 0)
     self.assertEquals(t1.value, 0)
     
     t2 = tree_node(None, None, 5)
     self.assertEquals(t2.value, 5)
     
     t3 = tree_node(t1, None, 10)
     self.assertEquals(t3.value, 10)
     
     t3 = tree_node(None, t2, 10)
     self.assertEquals(t3.value, 15)
     
     t3 = tree_node(t1, t2, 10)
     self.assertEquals(t3.value, 15)
def get_max_tree_node_path(grid):
    
    # Hold all nodes to reference parents when creating children
    branches = []
    
    for rowIndex in xrange(0, len(grid), 1):
        branch = []
        
        row = grid[rowIndex]
        
        for columnIndex in xrange(0, len(row), 1):
            leftParent, rightParent = None, None
            if rowIndex > 0:
                parentBranch = branches[rowIndex-1]
                
                if columnIndex < len(row) - 1:        
                    rightParent = parentBranch[columnIndex]
                
                if columnIndex > 0:
                    leftParent = parentBranch[columnIndex - 1]
                
            node = tree_node(leftParent, rightParent, row[columnIndex])
            branch.append(node)            
            
        branches.append(branch)
        
    return max(n.value for n in branches[-1])