LINTCODE —— 二叉查找树中搜索区间
问题描述:给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。
方法一:用的最简单的思路,把二叉树遍历出来,然后截取k1到k2之间的值就好了;
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> num;
if(root == NULL)
return num;
inorderTraversal(root , num );
vector<int> res;
for(int i = 0 ; i < num.size() ; i++)
{
if(num[i] > k2)
break;
if(num[i] >= k1 && num[i] <= k2)
res.push_back(num[i]);
}
return res;
}
void inorderTraversal(TreeNode *root , vector<int> &num)
{
if(root == NULL)
return ;
inorderTraversal(root -> left , num);
num.push_back(root -> val);
inorderTraversal(root -> right , num);
return;
}
};
方法二:在遍历的时候设置条件终止遍历,数组出来之后排序;
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> num;
if(root == NULL)
return num;
inorderTraversal(root ,num ,k1 ,k2);
//排序
sort(num.begin(),num.end());
return num;
}
void inorderTraversal(TreeNode *root ,vector<int> &num ,int k1 ,int k2)
{
if(root == NULL)
return ;
inorderTraversal(root -> left , num , k1 ,k2);
if(root -> val > k2)
return ;
else if(root -> val >= k1)
num.push_back(root -> val);
inorderTraversal(root -> right ,num ,k1 ,k2);
return ;
}
};