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.

/**
 * 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> seen;
        search(root, k1, k2, seen);
        return seen;
    }
    
    void search(TreeNode* root, int k1, int k2, vector<int>& seen) {
        if (k2 < k1 || root == NULL) {
            return;
        }
        if (k1 >= root->val) {
            // range all in right tree
            if (k1 == root->val) {
                seen.push_back(k1);
            }
            search(root->right, k1, k2, seen);
        } else if (k2 <= root->val) {
            // range all in left tree
            search(root->left, k1, k2, seen);
            if (k2 == root->val) {
                seen.push_back(k2);
            }
        } else {
            // normal
            search(root->left, k1, root->val, seen);
            seen.push_back(root->val);
            search(root->right, root->val, k2, seen);
        }
    }
};

把情况合并一下可以写成如下形式:

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> seen;
        search(root, k1, k2, seen);
        return seen;
    }
    
    void search(TreeNode* root, int k1, int k2, vector<int>& seen) {
        if (k2 < k1 || root == NULL) {
            return;
        }
        if (k1 < root->val) {
            search(root->left, k1, min(root->val, k2), seen);
        }
        if (k1 <= root->val && root->val <= k2) {
            seen.push_back(root->val);
        }
        if (k2 > root->val) {
            search(root->right, max(root->val, k1), k2, seen);
        }
    }
};
posted @ 2015-09-23 16:17  卖程序的小歪  阅读(184)  评论(0编辑  收藏  举报