2023-10-17 Daily Challenge
Today I have done leetcode's October LeetCoding Challenge with cpp
.
October LeetCoding Challenge 17
Description
Validate Binary Tree Nodes
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
Constraints:
n == leftChild.length == rightChild.length
1 <= n <= 104
-1 <= leftChild[i], rightChild[i] <= n - 1
Solution
auto speedup = [](){
cin.tie(nullptr);
cout.tie(nullptr);
ios::sync_with_stdio(false);
return 0;
}();
class Solution {
public:
bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) {
vector<bool> root(n, true);
for(int i = 0; i < n; ++i) {
if(leftChild[i] != -1) root[leftChild[i]] = false;
if(rightChild[i] != -1) root[rightChild[i]] = false;
}
queue<int> q;
for(int i = 0; i < n; ++i) {
if(root[i]) q.push(i);
}
if(q.size() != 1) return false;
set<int> visit;
while(q.size()) {
auto current = q.front();
q.pop();
if(visit.count(current)) return false;
visit.insert(current);
if(leftChild[current] != -1) {
q.push(leftChild[current]);
}
if(rightChild[current] != -1) {
q.push(rightChild[current]);
}
}
return visit.size() == n;
}
};
// Accepted
// 44/44 cases passed (50 ms)
// Your runtime beats 46.81 % of cpp submissions
// Your memory usage beats 42.86 % of cpp submissions (37.5 MB)