Java/653. Two Sum IV - Input is a BST 两数之和 IV - 输入 BST

60 篇文章 0 订阅
45 篇文章 0 订阅

题目


 

 

代码部分一(592ms)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    List<Integer> list = new ArrayList<Integer>();
    public boolean findTarget(TreeNode root, int k) {
        if(root == null)
            return false;
        changeList(root,k);
        boolean res = false;
        int len = list.size();
        if(len < 2)
            return false;
        for(int i = 0 ; i < len ; i++){
            for(int j = 0 ; j < len ; j++){
                if(i != j){
                    int temp = list.get(i) + list.get(j);
                    if(temp == k){
                        res = true;
                        break;
                    }
                }
                
            }
        }
        return res;
    }
    public void changeList(TreeNode root, int k){
        if(root.left != null)
            changeList(root.left, k);
	list.add(root.val);
        if(root.right != null)
            changeList(root.right, k);
    }
}
  1. 若树为空,返回 false
  2. 调用changeList()将树的所有节点值按中序遍历(正序)存入 list 中
  3. 若 list 长度小于2,直接返回false
  4. 调用两个循环遍历所有情况,若找到则返回 true
  5. 否则直接返回 res(false)

 

代码部分二(一改进 33ms)

class Solution {
    List<Integer> list = new ArrayList<Integer>();
    public boolean findTarget(TreeNode root, int k) {
        if(root == null)
            return false;
        changeList(root);
        boolean res = false;
        int i = 0, j = list.size() - 1;
        while(i < j){
            if(list.get(i) + list.get(j) == k){
                return true;
            }else if(list.get(i) + list.get(j) < k){
                i++;
            }else{
                j--;
            }
        }
        return res;
    }
    public void changeList(TreeNode root){
        if(root.left != null)
            changeList(root.left);
        list.add(root.val);
        if(root.right != null)
            changeList(root.right);
    }
}
  1. 此版本为一的改进版
  2. 中序遍历树,按正序将节点值存入 list
  3. 在while()中 从 list 的首尾元素(Min、Max)向中间值靠拢,直到找到符合值或循环条件不成立时跳出
  4. 若两个取值小于 K ,说明值偏小,此时应该将左值向左移一位
  5. 若两个取值大于K,说明值偏大,此时将右值向右移一位
  6. 最后返回 res

 

代码部分三(22ms)

class Solution {
    public boolean findTarget(TreeNode root, int k) {
        Set<Integer> set = new HashSet<Integer>();
        // 该方法未使用BST的特性,单纯从二叉树角度出发!!!
        return find(root, k, set);
    }
    
    public boolean find(TreeNode root, int k, Set<Integer> set){
        if(null == root){
            return false;
        }
        if(set.contains(k - root.val)){
            return true;
        }
        set.add(root.val);
        return find(root.left, k, set) || find(root.right, k, set);
    }
}
  1. 创建 set ,用于存储节点
  2. 返回find()函数
  3. 当前节点为空,返回 false
  4. 若目标值与当前节点的差 存在于 set 中,说明有两个节点使条件成立
  5. 每遍历一个值,将其存入 set
  6. 若左或右子树中存在使条件的两个节点,返回在 true , 否则返回false

 

代码部分四(19ms)

class Solution {
	public boolean findTarget(TreeNode root, int k) {
		forTree(root,root,k);
		return hasFind;
    }
	
	boolean hasFind = false;
	
	public void forTree(TreeNode rootDate,TreeNode root,int k){
		if (null == root)
			return;
		int need = k - root.val;
		TreeNode find = findK(rootDate, need);
		if (find != null && find != root) {
			hasFind = true;
		}
		forTree(rootDate, root.left, k);
		forTree(rootDate, root.right, k);
	}
	
	public TreeNode findK(TreeNode root, int k) {
		if (null != root){
			if (root.val == k) {
				return root;
			} else if (root.val > k) {
				TreeNode find = findK(root.left, k);
				if (find != null)
					return find;
			} else {
				TreeNode find = findK(root.right, k);
				if (find != null)
					return find;
			}
		}
		return null;
	}
}
  1. 调用fortree()
  2. 若当前节点为空,则返回null
  3. 取得目标值和当前节点的差值 need
  4. 调用函数findK(),找到与need相等的节点,并返回该节点
  5. 若存在节点,将hasFind赋值 true
  6. 遍历左子树和右子树
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用和引用的信息,问题出现在CMake Error at /opt/ros/melodic/share/catkin/cmake/safe_execute_process.cmake:11 (message)这一行。这个错误可能与包的依赖关系有关。在引用中提到了一个解决方法,即在package.xml文件中将'catkin'添加为buildtool的依赖项。你可以按照以下步骤进行操作: 1. 打开终端,并进入到ROS工作空间的src目录下: ``` cd ~/catkin_ws/src ``` 2. 打开package.xml文件: ``` sudo gedit package.xml ``` 3. 在<buildtool_depend>标签中添加'catkin': ``` <buildtool_depend>catkin</buildtool_depend> ``` 4. 保存并关闭package.xml文件。 然后,你可以重新运行catkin_make命令进行编译,应该可以通过了。请确保根据你的ROS版本进行相应的安装。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CMake Error at /opt/ros/melodic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):](https://blog.csdn.net/qq_42170079/article/details/118558386)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [CMake Error at /opt/ros/melodic/share/catkin/cmake/catkin_package.cmake:116 (message):catkin_package](https://blog.csdn.net/qq_45950023/article/details/121816434)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值