"""simple docstring"""




from __future__ import annotations

from collections import deque
from collections.abc import Sequence
from dataclasses import dataclass
from typing import Any
@dataclass
class 		__A							:
     _UpperCamelCase	      =	42
     _UpperCamelCase	      =	None
     _UpperCamelCase	      =	None







def 							SCREAMING_SNAKE_CASE  (    ) ->   Node | None:
  _lowerCAmelCase		: Tuple						    =  Node(1			)
  _lowerCAmelCase		: int						    =  Node(2			)
  _lowerCAmelCase		: int						    =  Node(3			)
  _lowerCAmelCase		: Any						    =  Node(4			)
  _lowerCAmelCase		: Dict						    =  Node(5			)
  return tree





def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: Node | None			) ->   list[int]:
  return [root.data, *preorder(root.left			), *preorder(root.right			)] if root else []





def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: Node | None			) ->   list[int]:
  return postorder(root.left			) + postorder(root.right			) + [root.data] if root else []





def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: Node | None			) ->   list[int]:
  return [*inorder(root.left			), root.data, *inorder(root.right			)] if root else []





def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: Node | None			) ->   int:
  return (max(height(root.left			)    ,height(root.right			)			) + 1) if root else 0





def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: Node | None			) ->   Sequence[Node | None]:
  _lowerCAmelCase		: list[Any]						    =  []

  if root is None:
    return output

  _lowerCAmelCase		: Union[str, Any]						    =  deque([root]			)

  while process_queue:
    _lowerCAmelCase		: Optional[Any]						    =  process_queue.popleft()
    output.append(node.data			)

    if node.left:
      process_queue.append(node.left			)
    if node.right:
      process_queue.append(node.right			)
  return output





def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: Node | None    ,_lowerCamelCase		: int			) ->   Sequence[Node | None]:
  _lowerCAmelCase		: list[Any]						    =  []

  def populate_output(_lowerCamelCase		: Node | None    ,_lowerCamelCase		: int			) -> None:
    if not root:
      return
    if level == 1:
      output.append(root.data			)
    elif level > 1:
      populate_output(root.left    ,level - 1			)
      populate_output(root.right    ,level - 1			)

  populate_output(_lowerCamelCase    ,_lowerCamelCase			)
  return output





def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: Node | None    ,_lowerCamelCase		: int			) ->   Sequence[Node | None]:
  _lowerCAmelCase		: list[Any]						    =  []

  def populate_output(_lowerCamelCase		: Node | None    ,_lowerCamelCase		: int			) -> None:
    if root is None:
      return
    if level == 1:
      output.append(root.data			)
    elif level > 1:
      populate_output(root.right    ,level - 1			)
      populate_output(root.left    ,level - 1			)

  populate_output(_lowerCamelCase    ,_lowerCamelCase			)
  return output





def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: Node | None			) ->   Sequence[Node | None] | list[Any]:
  if root is None:
    return []

  _lowerCAmelCase		: list[Sequence[Node | None]]						    =  []

  _lowerCAmelCase		: Tuple						    =  0
  _lowerCAmelCase		: Dict						    =  height(_lowerCamelCase			)

  for h in range(1    ,height_tree + 1			):
    if not flag:
      output.append(get_nodes_from_left_to_right(_lowerCamelCase    ,_lowerCamelCase			)			)
      _lowerCAmelCase		: Any						    =  1
    else:
      output.append(get_nodes_from_right_to_left(_lowerCamelCase    ,_lowerCamelCase			)			)
      _lowerCAmelCase		: Optional[int]						    =  0

  return output





def 							SCREAMING_SNAKE_CASE  (    ) ->   None:  # Main function for testing.
  _lowerCAmelCase		: int						    =  make_tree()
  print(f"In-order Traversal: {inorder(_lowerCamelCase			)}"			)
  print(f"Pre-order Traversal: {preorder(_lowerCamelCase			)}"			)
  print(f"Post-order Traversal: {postorder(_lowerCamelCase			)}"    ,"""\n"""			)

  print(f"Height of Tree: {height(_lowerCamelCase			)}"    ,"""\n"""			)

  print("""Complete Level Order Traversal: """			)
  print(level_order(_lowerCamelCase			)    ,"""\n"""			)

  print("""Level-wise order Traversal: """			)

  for level in range(1    ,height(_lowerCamelCase			) + 1			):
    print(f"Level {level}:"    ,get_nodes_from_left_to_right(_lowerCamelCase    ,level=_lowerCamelCase			)			)

  print("""\nZigZag order Traversal: """			)
  print(zigzag(_lowerCamelCase			)			)


if __name__ == "__main__":
     import doctest

     doctest.testmod()
     main()





"""simple docstring"""




def 							SCREAMING_SNAKE_CASE  (    _lowerCamelCase		: int			) ->   bool:
  return sum(i for i in range(1    ,number // 2 + 1			) if number % i == 0			) == number


if __name__ == "__main__":
     print('Program to check whether a number is a Perfect number or not...')
     _a   :	int 					=     int(input('Enter number: ').strip())
     print(F"""{number} is {"" if perfect(number) else "not "}a Perfect Number.""")




