• 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);
            }
        }
    };
    
  • 相关阅读:
    Jmeter非GUI模式运行脚本
    vmware下 linux如何扩展磁盘空间
    (完美解决方案)Windows Server 2012 R2报错:无法启动此程序,因为计算机中丢失 apimswincrtstdiol110.dll 解决
    Python程序执行性能优化心得
    jmeter中TPS和吞吐量区别与联系
    Python多进程之Pool进程池浅析
    为什么Jmeter 运行时到达持续时间不停止?
    一些在线实用小工具
    笔记20171225
    JMeter 安装 linux平台
  • 原文地址:https://www.cnblogs.com/lailailai/p/4832614.html
Copyright © 2020-2023  润新知