zoukankan      html  css  js  c++  java
  • leetcode 653 两数之和IV 输入BST

    package com.example.lettcode.test;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    /**
     * @Class FindTarget
     * @Description 653 两数之和IV 输入BST
     * 给定一个二叉搜索树和一个目标结果,
     * 如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true。
     * <p>
     * 案例 1:
     * 输入:
     * 5
     * / 
     * 3   6
     * /    
     * 2   4   7
     * Target = 9
     * 输出: True
     * <p>
     * 案例 2:
     * 输入:
     * 5
     * / 
     * 3   6
     * /    
     * 2   4   7
     * Target = 28
     * 输出: False
     * @Author
     * @Date 2020/7/20
     **/
    public class FindTarget {
        static class TreeNode {
            int val;
            TreeNode left;
            TreeNode right;
    
            TreeNode(int x) {
                val = x;
            }
        }
    }
    
    /**
     * 解法1: 先中序得到一个非递减的序列,然后再判断
     */
    public static boolean findTarget(TreeNode root, int k) {
    	boolean flag = false;
    	List<Integer> integerList = new ArrayList<>();
    	inOrder(root, integerList);
    	int p = 0, q = integerList.size() - 1;
    	while (p < q) {
    		int tmp = integerList.get(p) + integerList.get(q);
    		if (tmp == k) return true;
    		if (tmp > k) q--;
    		else if (tmp < k) p++;
    	}
    	return false;
    }
    
    public static void inOrder(TreeNode root, List<Integer> integerList) {
    	if (root == null) return;
    	inOrder(root.left, integerList);
    	integerList.add(root.val);
    	inOrder(root.right, integerList);
    }
    
    /**
     *  解法2:利用HashSet 保存已经遍历到的元素,判断是否存在与当前元素之和为目标值的元素
     *  存在即返回false,否则加入到set中并遍历左右子树
     *  使用类静态变量时每一个测试用例执行结束需要清除,否则会重复保存之前的记录
     *  或者使用类成员变量
     */
    static Set<Integer> integerSet = new HashSet<>();
    
    public static boolean findTarget(TreeNode root, int k) {
    	if (root == null) return false;
    	int tmp = k - root.val;
    	if (integerSet.contains(tmp)) return true;
    	integerSet.add(root.val);
    	return findTarget(root.left, k) || findTarget(root.right, k);
    }
    
    // 测试用例
    public static void main(String[] args) {
    	TreeNode root = new TreeNode(5);
    	TreeNode treeNode02 = new TreeNode(3);
    	TreeNode treeNode03 = new TreeNode(6);
    	root.left = treeNode02;
    	root.right = treeNode03;
    	TreeNode treeNode04 = new TreeNode(2);
    	TreeNode treeNode05 = new TreeNode(4);
    	treeNode02.left = treeNode04;
    	treeNode02.right = treeNode05;
    	TreeNode treeNode06 = new TreeNode(7);
    	treeNode05.right = treeNode06;
    	int target = 9;
    	boolean ans = findTarget(root, target);
    	integerSet.clear();
    	System.out.println("FindTarget demo01 result:" + ans);
    
    	target = 28;
    	ans = findTarget(root, target);
    	integerSet.clear();
    	System.out.println("FindTarget demo02 result:" + ans);
    
    	root = new TreeNode(1);
    	target = 2;
    	ans = findTarget(root, target);
    	integerSet.clear();
    	System.out.println("FindTarget demo03 result:" + ans);
    }
    
  • 相关阅读:
    Reflections 0.9.12 Caused by: java.lang.IllegalStateException: zip file closed
    关于使用GATEWAY后静态资源失效问题
    Gbase8.7 和shardingsphere4.1.1适配
    统信UOS笔记(V20)
    mysql笔记
    axios 设置全局取消请求
    arr 转 tree
    云知声 面试题
    百度 二面 99 乘法表
    百度 无人车 面试
  • 原文地址:https://www.cnblogs.com/fyusac/p/13343903.html
Copyright © 2011-2022 走看看