1. 程式人生 > >LeetCode總結 -- 二叉查詢樹篇

LeetCode總結 -- 二叉查詢樹篇

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                這篇總結主要介紹一個比較常見的資料結構--二叉查詢樹。二叉查詢樹既是一顆樹,又帶有特別的有序性質,所以考察的方式比較多而且靈活,屬於面試題目中的常客。LeetCode中關於二叉查詢樹的題目有以下幾道:

Validate Binary Search Tree
Recover Binary Search Tree
Unique Binary Search Trees
Unique Binary Search Trees II
Convert Sorted Array to Binary Search Tree
Convert Sorted List to Binary Search Tree

先來看看最基本的 Validate Binary Search Tree ,就是判斷一個樹是不是二叉查詢樹。比較簡單而且明瞭的方法就是利用二叉查詢樹的中序遍歷有序的性質,只要對樹進行一次中序遍歷,而其中的結點都滿足有序即可,實現上就是維護一個前驅結點,每次判斷前驅結點比當前結點要小。另一種方法是根據二叉查詢樹的定義來實現,保證結點滿足它的左子樹的每個結點比當前結點值小,右子樹的每個結點比當前結點值大,實現上就是對於每個結點儲存左右界,然後進行遞迴判斷左右界不會違背即可。


Recover Binary Search Tree 這道題目還是利用二叉查詢樹的主要性質,就是中序遍歷是有序。那麼如果其中有元素被調換了,意味著中序遍歷中必然出現違背有序的情況。主要考慮到就是出現違背的次數問題。這裡有兩種情況:
(1)如果是中序遍歷相鄰的兩個元素被調換了,很容易想到就只需會出現一次違反情況,只需要把這個兩個節點記錄下來最後調換值就可以;
(2)如果是不相鄰的兩個元素被調換了,會發生兩次逆序的情況,那麼這時候需要調換的元素應該是第一次逆序前面的元素,和第二次逆序後面的元素。 

Unique Binary Search Trees
這道題要求可行的二叉查詢樹的數量,其實二叉查詢樹可以任意取根,只要滿足中序遍歷有序的要求就可以。從處理子問題的角度來看,選取一個結點為根,就把結點切成左右子樹,以這個結點為根的可行二叉樹數量就是左右子樹可行二叉樹數量的乘積,所以總的數量是將以所有結點為根的可行結果累加起來。這其實是一個卡特蘭數的模型,所以按照公式進行實現就可以。而 Unique Binary Search Trees II則不能用卡特蘭數,因為要求出所有結果,所以還是得走遞迴遍歷的過程,然後把生成樹來的樹接上。

Convert Sorted Array to Binary Search TreeConvert Sorted List to Binary Search Tree則是屬於二叉查詢樹的構造問題,針對兩種不同資料結構陣列和連結串列進行構造。其實方法都是一樣,就是遞迴對視窗進行圈限,然後用中間的結點作為當前根,再遞迴生成左右子樹。連結串列的構造要稍微繞一些,因為要通過中序遍歷走到第一個結點,然後遞進連結串列。

這篇總結主要介紹LeetCode中關於二叉查詢樹的題目,二叉查詢樹因為是基本資料結構加上有可利用的有序性質,還是在面試中相當常見的,對於性質理解要深刻,實現要熟練哈。            

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述