題目描述
給定一個二叉搜索樹的 根節點 root 和一個整數 k , 請判斷該二叉搜索樹中是否存在兩個節點它們的值之和等於 k 。假設二叉搜索樹中節點的值均唯一。參考leetcode
分析
- 中序遍歷二叉樹,將節點的 value 保存到 ArrayList 中,ArrayList 中元素是有序的。
- 採用雙指針法,判斷 ArrayList 中是否存在兩個元素的和爲 k。可參考:找出數組中兩數之和爲指定值的所有整數對
代碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
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;
boolean exist = false;
while(i < j){
int sum = list.get(i) + list.get(j);
if(sum > k){
j--;
}else if(sum < k){
i++;
}else{
exist = true;
break;
}
}
return exist;
}
//中序遍歷二叉樹
private void inOrder(TreeNode root, List<Integer> list){
if(root == null){
return;
}
inOrder(root.left, list);
//將二叉樹遍歷的節點 val 保存到 list, 中序遍歷得到有序的 list
list.add(root.val);
inOrder(root.right, list);
}
}