-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathNo1361.validate-binary-tree-nodes.cs
69 lines (61 loc) · 2.06 KB
/
No1361.validate-binary-tree-nodes.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/*
* Difficulty:
* Medium
*
* Desc:
* You have n binary tree nodes numbered from 0 to n - 1 where node i has two children leftChild[i] and rightChild[i], return true if and only if all the given nodes form exactly one valid binary tree.
* If node i has no left child then leftChild[i] will equal -1, similarly for the right child.
* Note that the nodes have no values and that we only use the node numbers in this problem.
*
* Example 1:
* Input: n = 4, leftChild = [1,-1,3,-1], rightChild = [2,-1,-1,-1]
* Output: true
*
* Example 2:
* Input: n = 4, leftChild = [1,-1,3,-1], rightChild = [2,3,-1,-1]
* Output: false
*
* Example 3:
* Input: n = 2, leftChild = [1,0], rightChild = [-1,-1]
* Output: false
*
* Example 4:
* Input: n = 6, leftChild = [1,-1,-1,4,-1,-1], rightChild = [2,-1,-1,5,-1,-1]
* Output: false
*
* Constraints:
* 1 <= n <= 10^4
* leftChild.length == rightChild.length == n
* -1 <= leftChild[i], rightChild[i] <= n - 1
*/
public class Solution {
public bool ValidateBinaryTreeNodes(int n, int[] leftChild, int[] rightChild) {
int[] father = Enumerable.Range(0, n).ToArray();
for (int i = 0; i < leftChild.Length; i += 1) {
int left = leftChild[i];
if (left == -1) continue;
if (father[left] != left) return false;
int f = findFather(i);
if (f == left) return false;
father[left] = f;
}
for (int i = 0; i < rightChild.Length; i += 1) {
int right = rightChild[i];
if (right == -1) continue;
if (father[right] != right) return false;
int f = findFather(i);
if (f == right) return false;
father[right] = f;
}
int findFather(int i) {
while (father[i] != i) i = father[i];
return i;
}
int head = 0;
for (int i = 0; i < father.Length; i += 1) {
if (father[i] == i) head += 1;
if (head > 1) return false;
}
return head == 1;
}
}