1361.验证二叉树
https://leetcode-cn.com/problems/validate-binary-tree-nodes/
一:连通性判定
遍历数组 leftChild 和 rightChild,如果数组中的某个元素 x 不为 -1,那么就表示有一条边指向节点 x,节点 x 的入度 indeg[x]
增加 1。遍历完成后找入度为0的结点作为root(可能有多个,后面解决)
从root开始,用bfs遍历,当遇到已经访问过的结点,说明该节点入度大于1,而二叉树除根节点外每个节点入度为1,即判定不是二叉树
遍历结束,当访问过的结点数不等于n,说明存在两个以上的根节点,判断不是二叉树
class Solution:
def validateBinaryTreeNodes(self, n: int, leftChild , rightChild) :
indeg = [0]*n
#统计入度
for i in range(n):
if leftChild[i] != -1:
indeg[leftChild[i]] +=1
if rightChild[i] != -1:
indeg[rightChild[i]] +=1
# print(indeg)
root = -1
#找一个入度为0的作为root
for i in range(n):
if indeg[i] == 0:
root = i
break
if root == -1:
return False
q = [root]
visited = set([root])
while q:
node = q.pop(0)
#左子
left = leftChild[node]
if left != -1:
#入队时就标记访问
if left in visited:
return False
visited.add(left)
q.append(left)
#右子
right = rightChild[node]
if right != -1:
if right in visited:
return False
visited.add(right)
q.append(right)
return len(visited) == n
最后更新于