LC 1361 [M] Validate Binary Tree Nodes - ALawliet/algorithms GitHub Wiki

detect a cycle/toposort with BFS

class Solution:
	def validateBinaryNodes(self, n, leftChild, rightChild):
		# find the root node, assume root is node(0) by default
		# a node without any parent would be a root node
		# note: if there are multiple root nodes => 2+ trees
		root = 0
		childrenNodes = set(leftChild + rightChild)
		for i in range(n):
			if i not in childrenNodes:
				root = i
		
		# keep track of visited nodes
		visited = set()
		# queue to keep track of in which order do we need to process nodes
		Q = deque([root])
		
		while Q:
			node = Q.popleft()
			if node in visited:
				return False
			
			# mark visited
			visited.add(node)
			
			# process node
			if leftChild[node] != -1:
				Q.append(leftChild[node])
			if rightChild[node] != -1:
				Q.append(rightChild[node])
				
		# number of visited nodes == given number of nodes
		# if len(visited) != n => some nodes are unreachable/multiple different trees
		return len(visited) == n
class Solution:
    def validateBinaryTreeNodes(self, n: int, leftChild: List[int], rightChild: List[int]) -> bool:
        indegree = [0] * n

        for left, right in zip(leftChild, rightChild):
            if left != -1: indegree[left] += 1
            if right != -1: indegree[right] += 1
            if indegree[left] == 2 or indegree[right] == 2: return False # pointing to same node (2 parents)

        Q = deque(i for i, d in enumerate(indegree) if d == 0) # start with root

        if len(Q) == 2: return False # 2 roots

        while Q:
            node = Q.popleft()

            for child in leftChild[node], rightChild[node]:
                if child == -1: continue
                indegree[child] -= 1
                if indegree[child] == 0: Q.append(child)

        print(indegree)
        return sum(indegree) == 0