题目的链接在这里:https://leetcode-cn.com/problems/two-sum-iv-input-is-a-bst/
题目大意
给定一个二叉搜索树 root 和一个目标结果 k,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。一、示意图
二、解题思路
未优化和优化版
未优化
代码如下:
/**
* 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 {
HashSet<Integer> hashSet=new HashSet<Integer>();
public boolean findTarget(TreeNode root, int k) {
//给定一个二叉搜索树 和一个目标结果k 如果k存在两个元素 且值等于给定结果 那就返回true
//二叉搜索树 那就是有序的
//最暴力的方法就是 中序遍历 然后再一个个判断
findInorder(root,hashSet);
//然后开始判断 其实是一个有序递增的
Object[] objects = hashSet.toArray();
//双重循环进行判断
for(int i=0;i<objects.length-1;i++){
for(int j=1;j<objects.length;j++){
if(((Integer) objects[i]+(Integer) objects[j])==k&&((Integer) objects[i]!=(Integer) objects[j]))
return true;
}
}
return false;
}
private void findInorder(TreeNode root, HashSet<Integer> hashSet) {
//直接用递归的吧
if(root==null){
return;
}
else{
findInorder(root.left,hashSet);
//然后到最后一个位置
hashSet.add(root.val);
findInorder(root.right,hashSet);
}
}
}
递归加优化
代码如下:
/**
* 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 {
HashSet<Integer> hashSet=new HashSet<Integer>();
public boolean findTarget(TreeNode root, int k) {
return findInorder(root,hashSet,k);
}
private boolean findInorder(TreeNode root, HashSet<Integer> hashSet, int k) {
//直接用递归的吧
if(root==null){
return false;
}
if(hashSet.contains(k-root.val)){
return true;
}
hashSet.add(root.val);
return findInorder(root.right,hashSet, k)||findInorder(root.left,hashSet,k);
}
}