Advertisement
alex0sunny

search_trees

Sep 21st, 2021
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.99 KB | None | 0 0
  1. class Node:
  2.     def __init__(self, value, left=None, right=None):
  3.         self.value = value
  4.         self.right = right
  5.         self.left = left
  6.  
  7.  
  8. def get_combs(n, comb, res, visited):
  9.     if len(comb) == n:
  10.         tree = get_tree(comb)
  11.         if check_node(tree):
  12.             comb = tree_to_comb(tree)
  13.             res.add(tuple(comb))
  14.     else:
  15.         for i in range(n):
  16.             if not visited[i]:
  17.                 comb.append(i)
  18.                 visited[i] = True
  19.                 get_combs(n, comb, res, visited)
  20.                 comb.pop()
  21.                 visited[i] = False
  22.         return res
  23.  
  24.  
  25. def check_node(node, lo=-1, hi=1000):
  26.     if not lo < node.value < hi:
  27.         return False
  28.     if node.left and check_node(node.left, lo=lo, hi=node.value) is False or \
  29.             node.right and check_node(node.right, lo=node.value, hi=hi) is False:
  30.         return False
  31.     return True
  32.  
  33.  
  34. def get_tree(comb):
  35.     root = Node(comb[0])
  36.     for i in range(1, len(comb)):
  37.         num = comb[i]
  38.         node = root
  39.         while True:
  40.             if num < node.value:
  41.                 if node.left:
  42.                     node = node.left
  43.                 else:
  44.                     node.left = Node(num)
  45.                     break
  46.             if num > node.value:
  47.                 if node.right:
  48.                     node = node.right
  49.                 else:
  50.                     node.right = Node(num)
  51.                     break
  52.     return root
  53.  
  54.  
  55. def tree_to_comb(root):
  56.     nodes = [root]
  57.     comb = []
  58.     while nodes:
  59.         next_nodes = []
  60.         for node in nodes:
  61.             comb.append(node.value)
  62.             if node.left:
  63.                 next_nodes.append(node.left)
  64.             if node.right:
  65.                 next_nodes.append(node.right)
  66.         nodes = next_nodes
  67.     return comb
  68.  
  69.  
  70. def count_trees(n):
  71.     combs_set = get_combs(n, comb=[], res=set(), visited=[False] * n)
  72.     result = len(combs_set)
  73.     return result
  74.  
  75.  
  76. n = int(input())
  77. print(count_trees(n))
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement