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);
            }
        }
    };
    
  • 相关阅读:
    RabbitMq windows 安装
    JQuery.Ajax()的data参数传递方式
    [转载]ASP.NET中TextBox控件设立ReadOnly="true"后台取不到值
    vue-cli 3.0脚手架搭建项目
    二、操作符
    一、JavaScript基础
    html苹方字体
    js十大排序算法收藏
    iframe高度自适应的6个方法
    CSS3:不可思议的border属性
  • 原文地址:https://www.cnblogs.com/lailailai/p/4832614.html
Copyright © 2011-2022 走看看