--- title: 1361. Validate Binary Tree Nodes tags: graph description: share source code. --- # 1361. Validate Binary Tree Nodes ```java= class Solution { static class UnionFind{ int rank []; int parent[]; int component; public UnionFind(int n){ this.rank = new int [n]; this.parent = new int [n]; this.component = n; for(int i = 0; i < n; i++){ parent[i] = i; rank[i] = 1; } } public boolean isConnected(int u, int v){ return find(u) == find(v); } public void merge(int u, int v){ int pu = find(u); int pv = find(v); if(rank[pu] < rank[pv]){ parent[pu] = pv; }else if(rank[pu] > rank[pv]){ parent[pv] = pu; }else{ parent[pv] = pu; rank[pu] ++; } component --; } public int find(int u){ while(u != parent[u]){ parent[u] = parent[parent[u]]; u = parent[u]; } return u; } } public boolean validateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) { UnionFind uf = new UnionFind(n); int indegrees[] = new int [n]; for(int i = 0; i < n; i++){ // 1. union 沒法擋住重複走到的同ㄧ個點 (二個 edge 指向同ㄧ點, union 沒方向), 非 cycle // ex: 1 -> 2 <- 3 // 2. 如果點已經走過 (union 過), 又重複再出現 cycle, return false // ex: 1 <-> 2 // 3. 是否每一個點都 connected if(leftChild[i] != -1){ if(++indegrees[leftChild[i]] == 1 && !uf.isConnected(i , leftChild[i])){ uf.merge(i , leftChild[i]); }else{ return false; } } if(rightChild[i] != -1){ if(++indegrees[rightChild[i]] == 1 &&!uf.isConnected(i , rightChild[i])){ uf.merge(i , rightChild[i]); }else{ return false; } } } //System.out.println(uf.component); return uf.component == 1 ; } } ```