LintCode 11 二叉查找树的搜索区间

题目链接:http://www.lintcode.com/zh-cn/problem/search-range-in-binary-search-tree/

1、描述

给定两个值 k1 和 k2(k1 < k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。

2、样例

3、思路分析

要充分利用二叉查找树的特性:左小右大和中序遍历就是一个有序序列。

借助一个栈

想清楚进栈和出站的触发事件即可。

package com.hs;

import java.util.ArrayList;
import java.util.Stack;

//  Definition of TreeNode:
 class TreeNode {
      public int val;
      public TreeNode left, right;
      public TreeNode(int val) {
          this.val = val;
        this.left = this.right = null;
      }
  }

public class Solution {
    /**
     * @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.
     */
    public ArrayList<Integer> searchRange(TreeNode root, int k1, int k2) {
        //中序遍历
        ArrayList<Integer > list=new ArrayList<Integer>();
        Stack<TreeNode> S=new Stack<TreeNode>();
        if(root!=null){
            TreeNode p=root;
            S.push(p);
            p=p.left;
            while(!S.isEmpty()||p!=null){
                if(p!=null){
                    if(p.val>=k1){
                        S.push(p);
                        p=p.left;
                    }else {
                        p=p.right;
                    }
                }else {
                    p=S.pop();
                    //这个if判断使我们的程序通过了测试
                    if(p.val<k1){//因为头结点没有经过判断就进入栈中,所以需要特殊考虑下,思维要紧密
                        p=p.right;
                        continue;
                    }
                    if(p.val<=k2){
                        list.add(new Integer(p.val));
                        p=p.right;
                    }else {
                        return list;
                    }
                }
            }
        }
        return list;
    }
}

时间: 2024-10-05 04:24:11

LintCode 11 二叉查找树的搜索区间的相关文章

lintcode 11. 二叉查找树中搜索区间

class Solution { public: vector<int> res; int k11,k22; static bool comp(const int &a,const int &b) { return a<b; } /* * @param root: param root: The root of the binary search tree * @param k1: An integer * @param k2: An integer * @return:

搜索区间

搜索区间 给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置. 如果目标值不在数组中,则返回[-1, -1] 样例 给出[5, 7, 7, 8, 8, 10]和目标值target=8, 返回[3, 4] 挑战 时间复杂度 O(log n) 标签 数组 排序数组 二分法 1 class Solution { 2 /** 3 *@param A : an integer sorted array 4 *@param target : an integer to be

MVC5 + EF6 + Bootstrap3 (11) 排序、搜索、分页

文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-pagedlist.html 系列教程:MVC5 + EF6 + Bootstrap3 上一节:MVC5 + EF6 + Bootstrap3 (10) 数据查询页面 源码下载:点我下载 目录 前言 排序 搜索 分页 结尾 前言 上一节我们做到了如下的一个基础查询页面.本节我们向这个页面中加入排序.搜索和分页功能. 排序 从上图中的地址栏中可以看到

SICP 习题 (2.11)解题总结:区间乘法的优化

SICP 习题 2.11又出现Ben这个人了,如曾经说到的,仅仅要是Ben说的一般都是对的. 来看看Ben说什么.他说:"通过监測区间的端点,有可能将mul-interval分解为9中情况,每种情况中所须要的乘法都不超过两次". 所以这个叫Ben的人建议Allysa重写mul-interval过程. 究竟是啥意思呢.我们先来看看曾经的mul-interval过程: (define (mul-interval x y) (let (( p1 (* (lower-bound x) (low

一步一步跟我学习lucene(11)---lucene搜索之高亮显示highlighter

highlighter介绍 这几天一直加班,博客有三天没有更新了,望见谅:我们在做查询的时候,希望对我们自己的搜索结果与搜索内容相近的地方进行着重显示,就如下面的效果 这里我们搜索的内容是"一步一步跟我学习lucene",搜索引擎展示的结果中对用户的输入信息进行了配色方面的处理,这种区分正常文本和输入内容的效果即是高亮显示: 这样做的好处: 视觉上让人便于查找有搜索对应的文本块: 界面展示更友好: lucene提供了highlighter插件来体现类似的效果: highlighter对

hdu 4597 Play Game (记忆化搜索 区间dp)

#include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int dp[30][30][30][30]; int vis[30][30][30][30]; int a[2][30],sum[2][30]; int dfs(int i,int j,int k,int l) { if(vi

算法dfs——二叉搜索树中最接近的值 II

901. 二叉搜索树中最接近的值 II 中文 English 给定一棵非空二叉搜索树以及一个target值,找到 BST 中最接近给定值的 k 个数. 样例 样例 1: 输入: {1} 0.000000 1 输出: [1] 解释: 二叉树 {1},表示如下的树结构: 1 样例 2: 输入: {3,1,4,#,2} 0.275000 2 输出: [1,2] 解释: 二叉树 {3,1,4,#,2},表示如下的树结构: 3 / 1 4 2 挑战 假设是一棵平衡二叉搜索树,你可以用时间复杂度低于O(n)

模拟百度搜索框,输入时显示历史记录

今天写了个小demo,利用本地存储的特点,模拟百度搜索框. 主要知识是利用本地存储的特点,模拟百度搜索时的历史记录显示. 主要HTML代码为 <div class="search"> <input type="text"/> <button class="btn">搜索</button> </div> <ul class="hidden"> <li&

二叉树学习笔记之二叉查找树(BSTree)

二叉查找树即搜索二叉树,或者二叉排序树(BSTree),学习回顾一下有关的知识. >>关于二叉查找树 二叉查找树(Binary Search Tree)是指一棵空树或者具有下列性质的二叉树:1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值:2. 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值:3. 任意节点的左.右子树也分别为二叉查找树.4. 没有键值相等的节点,这个特征很重要,可以帮助理解二叉排序树的很多操作.二叉查找树具有很高的灵活性,对其优化可