和二叉搜索树没有一点关系hhhhh
只需要保存最后一次操作的颜色即可
解法一:
把所有节点的值存到集合里,从后遍历操作集合,删除这次操作中涉及到的元素,如果是染红,返回结果加一,蓝色的话直接删除。思路没有问题但是超时了。。。。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
Set<Integer> set = new HashSet<>();
public int getNumber(TreeNode root, int[][] ops) {
dfs(root);
int res = 0;
for (int i = ops.length - 1; i >= 0; i--) {
int p = ops[i][0];
int min = ops[i][1];
int max = ops[i][2];
if (!set.isEmpty()) {
for (int j = min; j <= max; j++) {
if (set.contains(j)) {
set.remove(j);
if (p == 1) {
res++;
}
}
}
}
}
return res;
}
public void dfs(TreeNode root) {
if (root == null) {
return;
}
dfs(root.left);
set.add(root.val);
dfs(root.right);
}
}
解法二:
遍历树的每个节点,每个节点都去从后遍历操作集合,一旦遇到操作区间包含节点值的,如果是染红,返回结果加一,然后跳出循环,染蓝的话直接跳出
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int res = 0;
public int getNumber(TreeNode root, int[][] ops) {
dfs(root,ops);
return res;
}
public void dfs(TreeNode root, int[][] ops) {
if (root == null) {
return;
}
dfs(root.left, ops);
check(root, ops);
dfs(root.right, ops);
}
public void check(TreeNode treeNode, int[][] ops) {
for (int i = ops.length - 1; i >= 0; i--) {
if (ops[i][0] == 1 && treeNode.val >= ops[i][1] && treeNode.val <= ops[i][2]) {
res++;
break;
}
if (ops[i][0] == 0 && treeNode.val >= ops[i][1] && treeNode.val <= ops[i][2]) {
break;
}
}
}
}