本文準備講解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].
問題的中文版本描述:
二叉查找樹搜索區間
給定兩個值 k1 和 k2(k1 < k2)和一個二叉查找樹的根節點。找到樹中所有值在 k1 到 k2 范圍內的節點。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找樹的中的節點值。返回所有升序的節點值。
樣例
如果有 k1 =10和 k2 =22, 你的程序應該返回[12, 20, 22].
? 該問題的解決算法需要達成以下的目標要點:找出所有符合條件的節點,對所有節點升序排列。二叉查找樹的特性為:若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值; 它的左、右子樹也分別為二叉排序樹。中序遍歷二叉查找樹,得到所有節點的升序排列。對本題而言,可以選擇任何一種遍歷方法找出符合條件的節點。選擇先序遍歷算法,中序遍歷算法或者后序遍歷算法都可以找到所有符合條件的節點。但選擇中序遍歷算法可以省略節點排序處理,因為二叉查找樹的中序遍歷會得出所有節點的升序排列序列。另外一個重要的優化處理方案:如果根節點比要求最低值還要小,則沒有必要再向左子節點搜索; 如果根節點比要求最高值還要大,則沒有必要再向右子節點搜索。
? 現在公布1種高效的算法方案,該方案需要用到遞歸運算:
? ? 以上算法方案的非遞歸版本: