bool findOther(TreeNode* root, int value, TreeNode* self) { if (root == NULL) return false; if (root->val == value && root != self) return true; else if (root->val > value && root->left != NULL) return findOther(root->left, value, self); else if (root->val < value && root->right != NULL) return findOther(root->right, value, self); return false; }
bool dfs(TreeNode* root, TreeNode* current, int k) { if (current == NULL) return false; if (findOther(root, k - current->val, current)) return true; if (current->left && dfs(root, current->left, k)) return true; if (current->right && dfs(root, current->right, k)) return true; return false; }
bool Events::unregisterEvent(Events::eventHandler *handler) { if (handler->type == event_input) { if (!findOther(event_input, handler->inputSpec.pin, handler->id)) { disableInputInterrupt(handler->inputSpec.interrupt); setInputHandler(handler->inputSpec.interrupt, 0); } } handler->type = event_free; return true; }
Events::eventHandler *Events::registerAnalogComp(byte mode, Events::eventCallback callback, void *data) { Events::eventHandler *result = registerEvent(event_analogcomp, callback, data); if (result == 0) { return 0; } result->analogCompSpec.mode = mode; if (!findOther(event_analogcomp, 0xff, result->id)) { setAnalogCompHandler(analogCompHandler); enableAnalogCompInterrupt(CHANGE); } return result; }
Events::eventHandler *Events::registerInput(byte input, byte mode, Events::eventCallback callback, void *data) { Events::eventHandler *result = registerEvent(event_input, callback, data); if (result == 0) { return 0; } result->inputSpec.interrupt = INTERRUPT_FOR_PIN(input); if (result->inputSpec.interrupt == -1) { return 0; } result->inputSpec.pin = input; result->inputSpec.mode = mode; if (!findOther(event_input, result->inputSpec.pin, result->id)) { setInputHandler(result->inputSpec.interrupt, inputHandler); enableInputInterrupt(result->inputSpec.interrupt, mode); } return result; }