2015年9月9日星期三

Lintcode: Search Range in Binary Search Tree

Given two values k1 and k2 (where k1 < k2) and a root pointer to a Binary Search Tree. Find all the keys of tree in range k1 to k2. i.e. print all x such that k1<=x<=k2 and x is a key of given BST. Return all the keys in ascending order.
Have you met this question in a real interview? 
Yes
Example
If k1 = 10 and k2 = 22, then your function should return [12, 20, 22].
    20
   /  \
  8   22
 / \
4   12
Tags Expand 

Reference: 

The essence is inorder traverses of BST
For each node,
its value is v
if v > k1, visit left subtree recursively
if k1 <= v <= k2, store the value
if v < k2, visit right subtree recursively

Time: O(n)
Space: O(L)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
 * Definition of TreeNode:
 * 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
        vector<int> result;
        searchRangeHelper(root, k1, k2, result);
        return result;
    }
    void searchRangeHelper(TreeNode* root, int k1, int k2, vector<int>& res){
        if(root == NULL) return;
        
        
        if(root->val > k1) searchRangeHelper(root->left, k1, k2, res);
        if(root->val >= k1 && root->val <= k2) res.push_back(root->val);
        
        if(root->val < k2) searchRangeHelper(root->right, k1, k2, res);
        
    }
};

没有评论:

发表评论