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