lintcode 11. 二叉查找树中搜索区间

Posted 年糕君の勉强笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lintcode 11. 二叉查找树中搜索区间相关的知识,希望对你有一定的参考价值。

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交换数据

以上是关于lintcode 11. 二叉查找树中搜索区间的主要内容,如果未能解决你的问题,请参考以下文章

LintCode 85. 在二叉查找树中插入节点

lintcode 二叉树中序遍历

在二叉搜索树中查找地板和天花板

NOI2009 二叉查找树 区间dp

使用C在搜索二叉树中查找最长路径

85 在二叉查找树中插入节点