LintCode问题图解-2

本文准备讲解1个简单的算法编程问题, 这个算法编程问题来自LintCode平台。不了解.LintCode平台的读者可以阅读笔者文章(在线编程平台推荐-LeetCode)。问题的英文版本描述如下:

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.

Example

If k1 =10 and k2 =22, then your function should return [12, 20, 22].


LintCode问题图解-2_第1张图片
例子图

问题的中文版本描述:

二叉查找树搜索区间

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

样例

如果有 k1 =10和 k2 =22, 你的程序应该返回[12, 20, 22].


LintCode问题图解-2_第2张图片
例子图

  该问题的解决算法需要达成以下的目标要点:找出所有符合条件的节点,对所有节点升序排列。二叉查找树的特性为:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。中序遍历二叉查找树,得到所有节点的升序排列。对本题而言,可以选择任何一种遍历方法找出符合条件的节点。选择先序遍历算法,中序遍历算法或者后序遍历算法都可以找到所有符合条件的节点。但选择中序遍历算法可以省略节点排序处理,因为二叉查找树的中序遍历会得出所有节点的升序排列序列。另外一个重要的优化处理方案:如果根节点比要求最低值还要小,则没有必要再向左子节点搜索; 如果根节点比要求最高值还要大,则没有必要再向右子节点搜索。

  现在公布1种高效的算法方案,该方案需要用到递归运算:


LintCode问题图解-2_第3张图片
递归的方案



    以上算法方案的非递归版本:


LintCode问题图解-2_第4张图片
非递归的方案

你可能感兴趣的:(LintCode问题图解-2)