领扣LintCode问题答案-11. 二叉查找树中搜索区间

领扣LintCode问题答案-11. 二叉查找树中搜索区间

目录

  • 11. 二叉查找树中搜索区间
  • 鸣谢

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

给定一个二叉查找树和范围[k1, k2]。按照升序返回给定范围内的节点值。

样例 1:

输入:{5},6,10
输出:[]
5
它将被序列化为 {5}
没有数字介于6和10之间

样例 2:

输入:{20,8,22,4,12},10,22
输出:[12,20,22]
解释:
20
/ \
8 22
/\
4 12
它将被序列化为 {20,8,22,4,12}
[12,20,22]介于10和22之间

import java.util.ArrayList;
import java.util.List;

/**
 * Definition of TreeNode:
 * public 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: param root: The root of the binary search tree
	 * @param k1:   An integer
	 * @param k2:   An integer
	 * @return: return: Return all keys that k1<=key<=k2 in ascending order
	 */
	public List<Integer> searchRange(TreeNode root, int k1, int k2) {
     
		// write your code here
		List<Integer> ret = new ArrayList<>();
		int           k   = k1;
		while (k <= k2) {
     
			TreeNode node = this.searchFirstGeNode(root, k, k2);
			if (node == null) {
     
				k++;
			} else if (node.val > k2) {
     
				break;
			} else if (node.val >= k1) {
     
				ret.add(node.val);
				k = node.val + 1;
			}
		}
		return ret;
	}

	private TreeNode searchFirstGeNode(TreeNode root, int k1, int k2) {
     
		TreeNode minGeNode = null;
		TreeNode node      = root;
		while (node != null) {
     
			if (node.val == k1) {
     
				return node;
			} else if (node.val > k1) {
     
				if (node.left == null) {
     
					return node;
				}
				minGeNode = node;
				node = node.left;
			} else {
     
				node = node.right;
			}
		}

		return minGeNode;
	}
}

原题链接点这里

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

你可能感兴趣的:(算法,算法)