11.二叉查找树中搜索区间
个人的想法是中序遍历所有的树结点,如果这个树结点的值在题目要求的k1与k2之间的话用一个数组把它给存起来。每有一个树结点就将其插入到vector新数组中,最后对这个数组进行排序再输出。但是测试时遇到{1,2,#,#,4}之类的总是AC不了。也想过可能是因为#不能识别字符的原因,所以加上了判断#这个符号的if语句,但是还是有问题。放上有问题无法AC的代码:
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
private: vector<int> a;
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
if(root==NULL) return a;
if(root->val=='#') return a;
searchRange(root->left,k1,k2);
if(root->val>=k1 && root->val<=k2)
{
a.insert(a.begin(),root->val);
}
searchRange(root->right,k1,k2);
sort(a.begin(),a.end());
return a;
}
};
在网上看了大神的一些方案,其中有和我思路一致但是是利用列表实现的方案;还有以下AC代码:
class TreeNode {
public:
int val;
TreeNode *left, *right;
TreeNode(int val) {
this->val = val;
this->left = this->right = NULL;
}
};
class Solution {
public:
/**
* @param root: The root of the binary search tree.
* @param k1 and k2: range k1 to k2.
* @return: Return all keys that k1<=key<=k2 in ascending order.
*/
vector<int> searchRange(TreeNode* root, int k1, int k2) {
// write your code here
if(root == NULL)
return vector<int>();
vector<int> result;
inorderTraversal(root, result, k1, k2);
return result;
}
void inorderTraversal(TreeNode *root, vector<int> &order, int k1, int k2) {
if(root->left != NULL)
inorderTraversal(root->left, order, k1, k2);
if(root->val >= k1 && root->val <= k2) {
order.push_back(root->val);
}
if(root->right != NULL)
inorderTraversal(root->right, order, k1, k2);
}
};
作者:YunLambert
-------------------------------------------
个性签名:一名会音乐、爱健身的不合格程序员
可以Follow博主的Github哦(っ•̀ω•́)っ✎⁾⁾