源题目

https://leetcode-cn.com/problems/two-sum-iv-input-is-a-bst/


给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。

示例 1:
双指针--LeetCode 653. 两数之和 IV - 输入 BST - 图1输入: root = [5,3,6,2,4,null,7], k = 9 输出: true
示例 2:
双指针--LeetCode 653. 两数之和 IV - 输入 BST - 图2输入: root = [5,3,6,2,4,null,7], k = 28 输出: false
示例 3:
输入: root = [2,1,3], k = 4 输出: true
示例 4:
输入: root = [2,1,3], k = 1 输出: false
示例 5:
输入: root = [2,1,3], k = 3 输出: true

提示:

  • 二叉树的节点个数的范围是 [1, 104].
  • -104 <= Node.val <= 104
  • root 为二叉搜索树
  • -105 <= k <= 105

    1. /**
    2. * Definition for a binary tree node.
    3. * class TreeNode {
    4. * public $val = null;
    5. * public $left = null;
    6. * public $right = null;
    7. * function __construct($val = 0, $left = null, $right = null) {
    8. * $this->val = $val;
    9. * $this->left = $left;
    10. * $this->right = $right;
    11. * }
    12. * }
    13. */
    14. class Solution {
    15. /**
    16. * @param TreeNode $root
    17. * @param Integer $k
    18. * @return Boolean
    19. */
    20. function findTarget($root, $k) {
    21. if(!$root) return false;
    22. $nums = [];
    23. $this->inOrder($root, $nums);
    24. $len = count($nums);
    25. $left = 0;
    26. $right = $len -1;
    27. while($left < $right){
    28. $sum = $nums[$left] + $nums[$right];
    29. if($sum == $k){
    30. return true;
    31. }else if($sum < $k){
    32. $left ++;
    33. }else{
    34. $right --;
    35. }
    36. }
    37. return false;
    38. }
    39. public function inOrder($node, &$nums){
    40. if(!$node) return false;
    41. $this->inOrder($node->left, $nums);
    42. $nums[] = $node->val;
    43. $this->inOrder($node->right, $nums);
    44. }
    45. }