classSolution: defclosestNodes(self, root: Optional[TreeNode], queries: List[int]) -> List[List[int]]: a = [] defdfs(o): if o isNone: return dfs(o.left) a.append(o.val) dfs(o.right) dfs(root)
ans = [[-1, -1] for _ inrange(len(queries))] for i, q inenumerate(queries): j = bisect_right(a, q) - 1 min = a[j] if j >= 0else -1 j = bisect_left(a, q) max = a[j] if j < len(a) else -1 ans[i] = [min, max] return ans
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */ classSolution { public: vector<vector<int>> closestNodes(TreeNode* root, vector<int>& queries) { vector<int> a; dfs(root, a); vector<vector<int>> ans; for (auto &x: queries) { int j = bisect_right(a, x); int min, max; if (j >= 0) { min = a[j]; } else { min = -1; }
j = bisect_left(a, x); if (j < a.size()) { max = a[j]; } else { max = -1; }
vector<int> i; i.push_back(min); i.push_back(max); ans.push_back(i); } return ans; } voiddfs(TreeNode* o, vector<int> &a){ if (o == nullptr) return; dfs(o->left, a); a.push_back(o->val); dfs(o->right, a); }
intbisect_left(vector<int> &a, int num){ int l = 0, r = a.size(); while (l < r) { int mid = (r - l >> 1) + l; if (a[mid] >= num) { r = mid; } else { l = mid + 1; } } return l; }
intbisect_right(vector<int> &a, int num){ int l = 0, r = a.size(); while (l < r) { int mid = (r - l >> 1) + l; if (num < a[mid]) { r = mid; } else { l = mid + 1; } } return l - 1; } };