题目描述
给定一个二叉搜索树的 根节点 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, 104 ]
.
-104 <= Node.val <= 104
root
为二叉搜索树
-105 <= k <= 105
注意:本题与主站 653 题相同: https://leetcode.cn/problems/two-sum-iv-input-is-a-bst/
解法
方法一
Python3 Java C++ Go TypeScript Swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 # Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution :
def findTarget ( self , root : TreeNode , k : int ) -> bool :
def find ( root ):
if not root :
return False
if k - root . val in nodes :
return True
nodes . add ( root . val )
return find ( root . left ) or find ( root . right )
nodes = set ()
return find ( root )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 /**
* 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 {
private Set < Integer > nodes ;
public boolean findTarget ( TreeNode root , int k ) {
nodes = new HashSet <> ();
return find ( root , k );
}
private boolean find ( TreeNode root , int k ) {
if ( root == null ) {
return false ;
}
if ( nodes . contains ( k - root . val )) {
return true ;
}
nodes . add ( root . val );
return find ( root . left , k ) || find ( root . right , k );
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public :
unordered_set < int > nodes ;
bool findTarget ( TreeNode * root , int k ) {
return find ( root , k );
}
bool find ( TreeNode * root , int k ) {
if ( ! root ) return false ;
if ( nodes . count ( k - root -> val )) return true ;
nodes . insert ( root -> val );
return find ( root -> left , k ) || find ( root -> right , k );
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func findTarget ( root * TreeNode , k int ) bool {
nodes := make ( map [ int ] bool )
var find func ( root * TreeNode , k int ) bool
find = func ( root * TreeNode , k int ) bool {
if root == nil {
return false
}
if nodes [ k - root . Val ] {
return true
}
nodes [ root . Val ] = true
return find ( root . Left , k ) || find ( root . Right , k )
}
return find ( root , k )
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function findTarget ( root : TreeNode | null , k : number ) : boolean {
let nodes : Set < number > = new Set ();
return find ( root , k , nodes );
}
function find ( root : TreeNode | null , k : number , nodes : Set < number > ) : boolean {
if ( ! root ) return false ;
if ( nodes . has ( k - root . val )) return true ;
nodes . add ( root . val );
return find ( root . left , k , nodes ) || find ( root . right , k , nodes );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 /* class TreeNode {
* var val: Int
* var left: TreeNode?
* var right: TreeNode?
* init() {
* self.val = 0
* self.left = nil
* self.right = nil
* }
* init(_ val: Int) {
* self.val = val
* self.left = nil
* self.right = nil
* }
* init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
* self.val = val
* self.left = left
* self.right = right
* }
* }
*/
class Solution {
private var nodes : Set < Int > = []
func findTarget ( _ root : TreeNode ?, _ k : Int ) -> Bool {
nodes = []
return find ( root , k )
}
private func find ( _ root : TreeNode ?, _ k : Int ) -> Bool {
guard let node = root else {
return false
}
if nodes . contains ( k - node . val ) {
return true
}
nodes . insert ( node . val )
return find ( node . left , k ) || find ( node . right , k )
}
}
GitHub