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;
    }
}
View Code

 

posted @ 2016-08-11 14:23  苏羽垄  阅读(384)  评论(0编辑  收藏  举报