给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
使用中序遍历得到有序数组之后,再利用双指针对数组进行查找。
应该注意到,这一题不能用分别在左右子树两部分来处理这种思想,因为两个待求的节点可能分别在左右子树中。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean findTarget(TreeNode root, int k) {
/*不能采用左右子节点分别迭代的算法,因为目标值有可能分布于左右子节点中
应采用中序遍历的方法,将结果值放在一个有序数组中;然后采用双指针思路;
进行遍历求和*/
List<Integer> list=new ArrayList<>();
inOrder(root,list);
int i=0;
int j=list.size()-1;
while(i<j){
int target=list.get(i)+list.get(j);
if(target==k){
return true;
}else if(target<k){
i++;
}else{
j--;
}
}
return false;
}
public void inOrder(TreeNode root,List<Integer> list){
if(root==null) return ;
//先遍历左子节点
inOrder(root.left,list);
//加入根节点
list.add(root.val);
//再加入右子节点
inOrder(root.right,list);
}
}