class Solution { public: vector<int> res; int k11,k22; static bool comp(const int &a,const int &b) { return a<b; } /* * @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 k11=k1; k22=k2; dfs(root); sort(res.begin(),res.end(),comp); return res; } void dfs(TreeNode *node){ if(node == NULL) return; if(node->val <= k22 && node->val >= k11){ res.push_back(node->val); } dfs(node->left); dfs(node->right); } };
这个题目也是挺简单的,不过这里用到了对vector的排序。
会发现是直接传入开头和结尾的,然后进一步去了解一下其中的原理:
vector采用的数据结构很简单:线性的连续空间。
它以两个迭代器start和finish分别指向配置得来的连续空间中目前已经被使用的空间。迭代器end_of_storage指向整个连续空间的尾部。
另外对于vector这里是常用的函数(来源百度):
- 1.push_back 在数组的最后添加一个数据
- 2.pop_back 去掉数组的最后一个数据
- 3.at 得到编号位置的数据
- 4.begin 得到数组头的指针
- 5.end 得到数组的最后一个单元+1的指针
- 6.front 得到数组头的引用
- 7.back 得到数组的最后一个单元的引用
- 8.max_size 得到vector最大可以是多大
- 9.capacity 当前vector分配的大小
- 10.size 当前使用数据的大小
- 11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
- 12.reserve 改变当前vecotr所分配空间的大小
- 13.erase 删除指针指向的数据项
- 14.clear 清空当前的vector
- 15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
- 16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
- 17.empty 判断vector是否为空
- 18.swap 与另一个vector交换数据