-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy path11.search-range-in-binary-search-tree.py
111 lines (100 loc) · 2.37 KB
/
11.search-range-in-binary-search-tree.py
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# Tag: Binary Tree, Divide and Conquer, Binary Search Tree, Depth First Search/DFS
# Time: O(N)
# Space: O(H)
# Ref: -
# Note: InOrder
# Given a binary search tree and a range `[k1, k2]`, return node values within a given range in ascending order.
#
# **Example 1:**
#
# Input:
# ```
# tree = {5}
# k1 = 6
# k2 = 10
# ```
# Output:
# ```
# []
# ```
# Explanation:
#
# No number between 6 and 10
#
# **Example 2:**
#
# Input:
# ```
# tree = {20,8,22,4,12}
# k1 = 10
# k2 = 22
# ```
# Output:
# ```
# [12,20,22]
# ```
# Explanation:
#
# [12,20,22] between 10 and 22
#
#
from typing import (
List,
)
from lintcode import (
TreeNode,
)
"""
Definition of TreeNode:
class TreeNode:
def __init__(self, val):
self.val = val
self.left, self.right = None, None
"""
class Solution:
"""
@param root: param root: The root of the binary search tree
@param k1: An integer
@param k2: An integer
@return: return: Return all keys that k1<=key<=k2 in ascending order
"""
def search_range(self, root: TreeNode, k1: int, k2: int) -> List[int]:
# write your code here
stack = []
node = root
res = []
while (len(stack) > 0 or node):
while node:
if node.val < k1:
node = node.right
else:
stack.append(node)
node = node.left
if len(stack) > 0:
node = stack.pop()
if node.val > k2:
break
if node.val >= k1:
res.append(node.val)
node = node.right
return res
class Solution:
"""
@param root: param root: The root of the binary search tree
@param k1: An integer
@param k2: An integer
@return: return: Return all keys that k1<=key<=k2 in ascending order
"""
def search_range(self, root: TreeNode, low: int, high: int) -> List[int]:
result = []
def inOrderTraversal(node):
if node is None:
return
if node.val > low:
inOrderTraversal(node.left)
if low <= node.val <= high:
result.append(node.val)
if node.val < high:
inOrderTraversal(node.right)
inOrderTraversal(root)
return result