educative.io

Question For Print Tree Perimeter -- Iterative solution

I really don’t understand print_leaf_nodes part. How we go from leaf node 10 to node 60? I spent so much time on this already. If someone could help me out, I highly appreciate it! Below is the solution code I copied and pasted. I added some code in that part to demonstrate my point. I hope my question makes sense. Thank you!

def print_left_perimeter(root, result):
  while root != None:
    curr_val = root.data

    if root.left != None:
      root = root.left
    elif root.right != None:
      root = root.right
    else: # leaf node
      break
    # print(str(curr_val) + " ", end="")
    result.append(str(curr_val) + " ")

def print_right_perimeter(root, result):
  r_values = [] # stack for right side values.

  while root != None:
    curr_val = root.data

    if root.right != None:
      root = root.right
    elif root.left != None:
      root = root.left
    else: # leaf node
      break
    r_values.append(curr_val)

  while len(r_values) != 0:
    # print(str(r_values.pop()) + " ", end="")
    result.append(str(r_values.pop()) + " ")

def print_leaf_nodes(root, result):
  """
  START: my added code for understanding
  """
  if root != None:
    print("enter leaf", root.data)
  else:
    print("enter leaf", None)
  """
  END: my added code ends
  """

  if root != None:
    print_leaf_nodes(root.left, result)

    if root.left == None and root.right == None:
      """
      START: my added code for understanding
      """
      if root:
        print("append to leaf to result", root.data)
      else:
        print("append to leaf to result", None)
      """
      END: my added code ends
      """
      # print(str(root.data) + " ", end="")
      result.append(str(root.data) + " ")

    print_leaf_nodes(root.right, result)

def display_tree_perimeter(root):
  result = []
  if root != None:
    # print(str(root.data) + " ", end="")
    result.append(str(root.data) + " ")

    print_left_perimeter(root.left, result)

    if root.left != None or root.right != None:
      print_leaf_nodes(root, result)

    print_right_perimeter(root.right, result) 
  return ('').join(result)

arr = [100,50,200,25,60,350,10,70,400]
root = create_BST(arr)
print("\nPrint tree perimeter\n")
print(display_tree_perimeter(root))