1. HashSet

    添加 add
    是否存在 contains
    删除 remove
    清空 clear

    1. public boolean dfs(TreeNode root, int target) {
    2. if (root == null) return false;
    3. if (set.contains(target - root.val)) return true;
    4. else set.add(root.val);
    5. return dfs(root.left, target) || dfs(root.right, target);
    6. }
    1. 双指针法 搜索树中序遍历

    利用bst特性
    ArrayDeque
    在队列尾插入addLast
    取出队列尾,不删除peekLast
    取出队列尾并删除pollLast

    1. public boolean findTarget(TreeNode root, int k) {
    2. Deque<TreeNode> leftdeque = new ArrayDeque<>(), rightdeque = new ArrayDeque<>();
    3. leftdeque.addLast(root);
    4. TreeNode node = root;
    5. while (node != null) {
    6. leftdeque.addLast(node);
    7. node = node.left;
    8. }
    9. node = root;
    10. while (node != null) {
    11. rightdeque.addLast(node);
    12. node = node.right;
    13. }
    14. TreeNode l = leftdeque.peekLast(), r = rightdeque.peekLast();
    15. while (l.val < r.val) {
    16. int t = l.val + r.val;
    17. if (t == k) return true;
    18. if (t < k) l = getNext(leftdeque, true);
    19. else r = getNext(rightdeque, false);
    20. }
    21. return false;
    22. }
    23. public TreeNode getNext(Deque<TreeNode> deque, boolean flag) {
    24. TreeNode node = flag ? deque.pollLast().right : deque.pollLast().left;
    25. while (node != null) {
    26. deque.addLast(node);
    27. node = flag ? node.left : node.right;
    28. }
    29. return deque.peekLast();
    30. }