Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Node:
- def __init__(self, value, left=None, right=None):
- self.value = value
- self.right = right
- self.left = left
- def get_combs(n, comb, res, visited):
- if len(comb) == n:
- tree = get_tree(comb)
- if check_node(tree):
- comb = tree_to_comb(tree)
- res.add(tuple(comb))
- else:
- for i in range(n):
- if not visited[i]:
- comb.append(i)
- visited[i] = True
- get_combs(n, comb, res, visited)
- comb.pop()
- visited[i] = False
- return res
- def check_node(node, lo=-1, hi=1000):
- if not lo < node.value < hi:
- return False
- if node.left and check_node(node.left, lo=lo, hi=node.value) is False or \
- node.right and check_node(node.right, lo=node.value, hi=hi) is False:
- return False
- return True
- def get_tree(comb):
- root = Node(comb[0])
- for i in range(1, len(comb)):
- num = comb[i]
- node = root
- while True:
- if num < node.value:
- if node.left:
- node = node.left
- else:
- node.left = Node(num)
- break
- if num > node.value:
- if node.right:
- node = node.right
- else:
- node.right = Node(num)
- break
- return root
- def tree_to_comb(root):
- nodes = [root]
- comb = []
- while nodes:
- next_nodes = []
- for node in nodes:
- comb.append(node.value)
- if node.left:
- next_nodes.append(node.left)
- if node.right:
- next_nodes.append(node.right)
- nodes = next_nodes
- return comb
- def count_trees(n):
- combs_set = get_combs(n, comb=[], res=set(), visited=[False] * n)
- result = len(combs_set)
- return result
- n = int(input())
- print(count_trees(n))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement