-
Notifications
You must be signed in to change notification settings - Fork 22
/
Copy path11.search-range-in-binary-search-tree.cpp
131 lines (118 loc) · 2.77 KB
/
11.search-range-in-binary-search-tree.cpp
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// 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
//
//
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
public:
/**
* @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
*/
vector<int> searchRange(TreeNode *root, int k1, int k2) {
// write your code here
vector<int> res;
stack<TreeNode *> st;
TreeNode *node = root;
while (st.size() > 0 || node) {
while (node) {
if (node->val < k1) {
node = node->right;
} else {
st.push(node);
node = node->left;
}
}
if (st.size() > 0) {
node = st.top();
st.pop();
if (node->val > k2) {
break;
}
if (node->val >= k1) {
res.push_back(node->val);
}
node = node->right;
}
}
return res;
}
};
class Solution {
public:
/**
* @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
*/
vector<int> searchRange(TreeNode *root, int k1, int k2) {
// write your code here
vector<int> res;
helper(root, k1, k2, res);
return res;
}
void helper(TreeNode *node, int low, int high, vector<int>& res) {
if (node == nullptr) {
return;
}
if (node->val > low) {
helper(node->left, low, high, res);
}
if (node->val >= low && node->val <= high) {
res.push_back(node->val);
}
if (node->val < high) {
helper(node->right, low, high, res);
}
}
};