给定一个二叉搜索树的 根节点 root 和一个整数 k , 请判断该二叉搜索树中是否存在两个节点它们的值之和等于 k 。假设二叉搜索树中节点的值均唯一。
示例 1:
输入: root = [8,6,10,5,7,9,11], k = 12
输出: true
解释: 节点 5 和节点 7 之和等于 12
示例 2:
输入: root = [8,6,10,5,7,9,11], k = 22
输出: false
解释: 不存在两个节点值之和为 22 的节点
提示:
二叉树的节点个数的范围是 [1, 10^4].
-10^4 <= Node.val <= 10^4
root 为二叉搜索树
-10^5 <= k <= 10^5
java代码:
class Solution {
public boolean findTarget(TreeNode root, int k) {
Set<Integer> set = new HashSet<>();
TreeNode cur = root;
while(cur != null){ //Morris中序遍历
if(cur.left == null){ //cur没有左子树
if(set.contains(k - cur.val)) return true; //匹配成功
set.add(cur.val); //匹配失败,记录cur
cur = cur.right; //去cur的右子树
}else{
//cur有左子树,处理左子树
TreeNode p = cur.left;
while(p.right!=null && p.right!=cur) p = p.right;
if(p.right == null){
//第一次来
p.right = cur; //建立线索
cur = cur.left; //继续处理左子树
}else{
//第二次来
p.right = null; //收回线索
if(set.contains(k - cur.val)) return true; //匹配成功
set.add(cur.val); //匹配失败,记录cur
cur = cur.right; //去cur的右子树
}
}
}
return false;
}
}