[LeetCode] 653. Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST such that their sum is equal to the given target.
Example 1:
Input:
- 5
- / \
- 3 6
- / \ \
- 2 4 7
Target = 9
Output: True
Example 2:
Input:
- 5
- / \
- 3 6
- / \ \
- 2 4 7
Target = 28
Output: False
思路:
Two Sum的变种题,这次输入的是一个二叉树,还是用HashMap,然后遍历二叉树,用之前的方法找就行了。
还有一种方法是利用BST的性质,进行查找。
Java:
This method also works for those who are not BSTs. The idea is to use a hashtable to save the values of the nodes in the BST. Each time when we insert the value of a new node into the hashtable, we check if the hashtable contains k - node.val.
Time Complexity: O(n), Space Complexity: O(n).
- public boolean findTarget(TreeNode root, int k) {
- HashSet<Integer> set = new HashSet<>();
- return dfs(root, set, k);
- }
- public boolean dfs(TreeNode root, HashSet<Integer> set, int k){
- if(root == null)return false;
- if(set.contains(k - root.val))return true;
- set.add(root.val);
- return dfs(root.left, set, k) || dfs(root.right, set, k);
- }
Java:
The idea is to use a sorted array to save the values of the nodes in the BST by using an inorder traversal. Then, we use two pointers which begins from the start and end of the array to find if there is a sum k.
Time Complexity: O(n), Space Complexity: O(n).
- public boolean findTarget(TreeNode root, int k) {
- List<Integer> nums = new ArrayList<>();
- inorder(root, nums);
- for(int i = 0, j = nums.size()-1; i<j;){
- if(nums.get(i) + nums.get(j) == k)return true;
- if(nums.get(i) + nums.get(j) < k)i++;
- else j--;
- }
- return false;
- }
- public void inorder(TreeNode root, List<Integer> nums){
- if(root == null)return;
- inorder(root.left, nums);
- nums.add(root.val);
- inorder(root.right, nums);
- }
Java:
The idea is to use binary search method. For each node, we check if k - node.val exists in this BST.
Time Complexity: O(nh), Space Complexity: O(h). h is the height of the tree, which is logn at best case, and n at worst case.
- public boolean findTarget(TreeNode root, int k) {
- return dfs(root, root, k);
- }
- public boolean dfs(TreeNode root, TreeNode cur, int k){
- if(cur == null)return false;
- return search(root, cur, k - cur.val) || dfs(root, cur.left, k) || dfs(root, cur.right, k);
- }
- public boolean search(TreeNode root, TreeNode cur, int value){
- if(root == null)return false;
- return (root.val == value) && (root != cur)
- || (root.val < value) && search(root.right, cur, value)
- || (root.val > value) && search(root.left, cur, value);
- }
Java:
- public 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;
- while (i < j) {
- int sum = list.get(i) + list.get(j);
- if (sum == k) {
- return true;
- }
- else if (sum < k) {
- i++;
- }
- else {
- j--;
- }
- }
- return false;
- }
- public List<Integer> inorder(TreeNode root, List<Integer> list) {
- Stack<TreeNode> stack = new Stack<>();
- while (root != null || !stack.isEmpty()) {
- while (root != null) {
- stack.push(root);
- root = root.left;
- }
- root = stack.pop();
- list.add(root.val);
- root = root.right;
- }
- return list;
- }
- }
Java:
- public class Solution {
- public boolean findTarget(TreeNode root, int k) {
- Set<Integer> candidates = new HashSet<>();
- Stack<TreeNode> stack = new Stack<>();
- while (!stack.empty() || root != null) {
- if (root != null) {
- int val = root.val;
- if (candidates.contains(val)) {
- return true;
- } else {
- candidates.add(k - val);
- }
- stack.add(root);
- root = root.left;
- } else {
- TreeNode node = stack.pop();
- root = node.right;
- }
- }
- return false;
- }
- }
Python: 递归遍历BST + Two Sum
- class Solution(object):
- def findTarget(self, root, k):
- """
- :type root: TreeNode
- :type k: int
- :rtype: bool
- """
- self.dset = set()
- self.traverse(root)
- for n in self.dset:
- if k - n != n and k - n in self.dset:
- return True
- return False
- def traverse(self, root):
- if not root: return
- self.dset.add(root.val)
- self.traverse(root.left)
- self.traverse(root.right)
Python: wo, 160 ms, faster than 9.23% of Python online submissions
- class Solution(object):
- def findTarget(self, root, k):
- """
- :type root: TreeNode
- :type k: int
- :rtype: bool
- """
- nums = []
- self.dfs(root, nums)
- lookup = []
- for num in nums:
- if k - num in lookup:
- return True
- lookup.append(num)
- return False
- def dfs(self, root, res):
- if not root:
- return
- res.append(root.val)
- self.dfs(root.left, res)
- self.dfs(root.right, res)
Python: 递归遍历BST + 利用BST性质进行检索
- class Solution(object):
- def findTarget(self, root, k):
- """
- :type root: TreeNode
- :type k: int
- :rtype: bool
- """
- self.root = root
- self.k = k
- return self.findNumber(root)
- def findNumber(self, root):
- if not root: return False
- node = self.root
- n = self.k - root.val
- if n != root.val:
- while node:
- if node.val == n: return True
- if n > node.val: node = node.right
- else: node = node.left
- return self.findNumber(root.left) or self.findNumber(root.right)
Python:
- class Solution:
- def findTarget(self, root, k):
- candidates = set()
- stack = []
- while stack or root:
- if root:
- val = root.val
- if val in candidates:
- return True
- else:
- candidates.add(k - val)
- stack.append(root)
- root = root.left
- else:
- node = stack.pop()
- root = node.right
- return False
C++:
- bool findTarget(TreeNode* root, int k) {
- unordered_set<int> set;
- return dfs(root, set, k);
- }
- bool dfs(TreeNode* root, unordered_set<int>& set, int k){
- if(root == NULL)return false;
- if(set.count(k - root->val))return true;
- set.insert(root->val);
- return dfs(root->left, set, k) || dfs(root->right, set, k);
- }
C++:
- bool findTarget(TreeNode* root, int k) {
- vector<int> nums;
- inorder(root, nums);
- for(int i = 0, j = nums.size()-1; i<j;){
- if(nums[i] + nums[j] == k)return true;
- (nums[i] + nums[j] < k)? i++ : j--;
- }
- return false;
- }
- void inorder(TreeNode* root, vector<int>& nums){
- if(root == NULL)return;
- inorder(root->left, nums);
- nums.push_back(root->val);
- inorder(root->right, nums);
- }
C++:
- bool findTarget(TreeNode* root, int k) {
- return dfs(root, root, k);
- }
- bool dfs(TreeNode* root, TreeNode* cur, int k){
- if(cur == NULL)return false;
- return search(root, cur, k - cur->val) || dfs(root, cur->left, k) || dfs(root, cur->right, k);
- }
- bool search(TreeNode* root, TreeNode *cur, int value){
- if(root == NULL)return false;
- return (root->val == value) && (root != cur)
- || (root->val < value) && search(root->right, cur, value)
- || (root->val > value) && search(root->left, cur, value);
- }
相似题目:
[LeetCode] 167. Two Sum II - Input array is sorted 两数和 II - 输入是有序的数组
[LeetCode] 170. Two Sum III - Data structure design 两数之和之三 - 数据结构设计
[LeetCode] 653. Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树的更多相关文章
- [LeetCode] Two Sum IV - Input is a BST 两数之和之四 - 输入是二叉搜索树
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
- [LeetCode] 167. Two Sum II - Input array is sorted 两数和 II - 输入是有序的数组
Given an array of integers that is already sorted in ascending order, find two numbers such that the ...
- Leetcode653.Two Sum IV - Input is a BST两数之和4-输入BST
给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. struct TreeNode { int val; struct TreeNode * ...
- LeetCode 653 Two Sum IV - Input is a BST 解题报告
题目要求 Given a Binary Search Tree and a target number, return true if there exist two elements in the ...
- LeetCode - 653. Two Sum IV - Input is a BST
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
- LeetCode 653. Two Sum IV – Input is a BST
Given a Binary Search Tree and a target number, return true if there exist two elements in the BST s ...
- 167 Two Sum II - Input array is sorted 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数.函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2.请注意,返回的下标值(i ...
- leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST
1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...
- 【Leetcode_easy】653. Two Sum IV - Input is a BST
problem 653. Two Sum IV - Input is a BST 参考 1. Leetcode_easy_653. Two Sum IV - Input is a BST; 完
随机推荐
- Codeforces A. Game on Tree(期望dfs)
题目描述: Game on Tree time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- Zabbix导入MySQL数据库报错ERROR 1046 (3D000) at line 1: No database selected
使用如下命令导入Zabbix数据库时报错 解决办法: 1.先把原始的数据库压缩包备份 cd /usr/share/doc/zabbix-server-mysql-4.0.7/ cp create.sq ...
- NodeJS 多版本管理(NVM)
前言 现在前端各种框架更新较快,对 Node 的依赖也不一样,Node 的过版本管理也很有必要. NVM(Node Version Manager),是一个 Node 的版本管理工具. 官方的 NVM ...
- Python应用之-修改通讯录
#-*- coding:utf-8 -*- import sqlite3 #打开本地数据库用于存储用户信息 conn = sqlite3.connect('mysql_person.db') #在该数 ...
- Laravel —— 多模块开发
Laravel 框架比较庞大,更适用于比较大的项目. 为了整个项目文件结构清晰,不同部分分为不同模块很有必要. 一.安装扩展包 1.根据不同 Laravel 版本,选择扩展包版本. packagest ...
- django-列表分页和排序
视图函数views.py # 种类id 页码 排序方式 # restful api -> 请求一种资源 # /list?type_id=种类id&page=页码&sort=排序方 ...
- c#——ref 和 out 的区别
一个用关键字 ref 标示,一个用 out 标示. 牵扯到数据是引用类型还是值类型. 一般用这两个关键字你是想调用一个函数将某个值类型的数据通过一个函数后进行更改.传 out 定义的参数进去的时候这个 ...
- 关于#pragma once和#ifndef
[1]#pragma once这个宏有什么作用? 为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式:另一种是#pragma once方式.在能够 ...
- Python 06 Geany的基本使用2
原文:https://www.cnblogs.com/denny402/p/5096001.html 功能:打开图片 1.下载库 pip install matplotlib 2.编写代码,将代码粘贴 ...
- Vue.set 向响应式对象中添加响应式属性,及设置数组元素触发视图更新
一.为什么需要使用Vue.set? vue中不能检测到数组和对象的两种变化: 1.数组长度的变化 vm.arr.length = 4 2.数组通过索引值修改内容 vm.arr[1] = ‘aa’ Vu ...