zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    };
    
  • 相关阅读:
    R dataframe 筛选
    R dataframe 统计每行中大于某个值的列的数量
    参考基因组
    C++/CLI入门系列 第二篇:封装C++ dll库,提供接口给C#调用
    C++/CLI入门系列 第一篇:HelloWorld
    用C++/CLI搭建C++和C#之间的桥梁
    C++ CLI简介(什么是C++ CLI)
    GB28181协议RTP传输
    gsoap使用总结
    C++ (使用gsoap)调用 WCF服务
  • 原文地址:https://www.cnblogs.com/lailailai/p/4832614.html
Copyright © 2011-2022 走看看