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);
    }
};
posted @ 2017-12-12 15:01  MrYun  阅读(232)  评论(0)    收藏  举报