- HashSet
添加 add
是否存在 contains
删除 remove
清空 clear
public boolean dfs(TreeNode root, int target) {
if (root == null) return false;
if (set.contains(target - root.val)) return true;
else set.add(root.val);
return dfs(root.left, target) || dfs(root.right, target);
}
- 双指针法 搜索树中序遍历
利用bst特性
ArrayDeque
在队列尾插入addLast
取出队列尾,不删除peekLast
取出队列尾并删除pollLast
public boolean findTarget(TreeNode root, int k) {
Deque<TreeNode> leftdeque = new ArrayDeque<>(), rightdeque = new ArrayDeque<>();
leftdeque.addLast(root);
TreeNode node = root;
while (node != null) {
leftdeque.addLast(node);
node = node.left;
}
node = root;
while (node != null) {
rightdeque.addLast(node);
node = node.right;
}
TreeNode l = leftdeque.peekLast(), r = rightdeque.peekLast();
while (l.val < r.val) {
int t = l.val + r.val;
if (t == k) return true;
if (t < k) l = getNext(leftdeque, true);
else r = getNext(rightdeque, false);
}
return false;
}
public TreeNode getNext(Deque<TreeNode> deque, boolean flag) {
TreeNode node = flag ? deque.pollLast().right : deque.pollLast().left;
while (node != null) {
deque.addLast(node);
node = flag ? node.left : node.right;
}
return deque.peekLast();
}