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].


例子圖

問題的中文版本描述:

二叉查找樹搜索區(qū)間

給定兩個值 k1 和 k2(k1 < k2)和一個二叉查找樹的根節(jié)點。找到樹中所有值在 k1 到 k2 范圍內的節(jié)點。即打印所有x (k1 <= x <= k2) 其中 x 是二叉查找樹的中的節(jié)點值。返回所有升序的節(jié)點值。

樣例

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


例子圖

? 該問題的解決算法需要達成以下的目標要點:找出所有符合條件的節(jié)點,對所有節(jié)點升序排列。二叉查找樹的特性為:若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值; 它的左、右子樹也分別為二叉排序樹。中序遍歷二叉查找樹,得到所有節(jié)點的升序排列。對本題而言,可以選擇任何一種遍歷方法找出符合條件的節(jié)點。選擇先序遍歷算法,中序遍歷算法或者后序遍歷算法都可以找到所有符合條件的節(jié)點。但選擇中序遍歷算法可以省略節(jié)點排序處理,因為二叉查找樹的中序遍歷會得出所有節(jié)點的升序排列序列。另外一個重要的優(yōu)化處理方案:如果根節(jié)點比要求最低值還要小,則沒有必要再向左子節(jié)點搜索; 如果根節(jié)點比要求最高值還要大,則沒有必要再向右子節(jié)點搜索。

? 現(xiàn)在公布1種高效的算法方案,該方案需要用到遞歸運算:


遞歸的方案



? ? 以上算法方案的非遞歸版本:


非遞歸的方案
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結點至多有m個孩子。 除根結點和葉子結點外,其它每個結點至少有m...
    文檔隨手記閱讀 13,341評論 0 25
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,159評論 0 12
  • 基于樹實現(xiàn)的數(shù)據(jù)結構,具有兩個核心特征: 邏輯結構:數(shù)據(jù)元素之間具有層次關系; 數(shù)據(jù)運算:操作方法具有Log級的平...
    yhthu閱讀 4,315評論 1 5
  • 1. AVL樹 AVL樹簡單來說是帶有平衡條件的二叉查找樹.傳統(tǒng)來說是其每個節(jié)點的左子樹和右子樹的高度最多差1(注...
    fredal閱讀 1,848評論 0 4
  • 定義指針變量,如果不賦給它地址,系統(tǒng)會隨機給它分配一個地址。 C++標準庫 C++ Standard Librar...
    縱我不往矣閱讀 304評論 0 1