题目

类型:树

image.png

解题思路

题目给的是二叉搜索树(BST)
可以利用 BST 中序遍历有序的特性,实现类似「双指针」的效果
先让 BST 的最左链和最右链完全入栈,此时栈顶元素为 BST 中的最小值和最大值,分别使用 l 和 r 充当指针。根据两指针指向的节点值之和与 k 的大小关系来指导如何让 l 和 r 移动,l 的移动过程其实就是找下一个比 l.val 更大的值,而 r 的移动过程其实就是找下一个比 r.val 更小的值。

代码

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. public boolean findTarget(TreeNode root, int k) {
  18. Deque<TreeNode> ld = new ArrayDeque<>(), rd = new ArrayDeque<>();
  19. TreeNode temp = root;
  20. while (temp != null) {
  21. ld.addLast(temp);
  22. temp = temp.left;
  23. }
  24. temp = root;
  25. while (temp != null) {
  26. rd.addLast(temp);
  27. temp = temp.right;
  28. }
  29. TreeNode l = ld.peekLast(), r = rd.peekLast();
  30. while (l.val < r.val) {
  31. int t = l.val + r.val;
  32. if (t == k) return true;
  33. if (t < k) l = getNext(ld, true);
  34. else r = getNext(rd, false);
  35. }
  36. return false;
  37. }
  38. TreeNode getNext(Deque<TreeNode> d, boolean isLeft) {
  39. TreeNode node = isLeft ? d.pollLast().right : d.pollLast().left;
  40. while (node != null) {
  41. d.addLast(node);
  42. node = isLeft ? node.left : node.right;
  43. }
  44. return d.peekLast();
  45. }
  46. }