這篇總結主要介紹乙個比較常見的資料結構--二叉查詢樹。二叉查詢樹既是一顆樹,又帶有特別的有序性質,所以考察的方式比較多而且靈活,屬於面試題目中的常客。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 tree和
convert sorted list to binary search tree則是屬於二叉查詢樹的構造問題,針對兩種不同資料結構陣列和鍊錶進行構造。其實方法都是一樣,就是遞迴對視窗進行圈限,然後用中間的結點作為當前根,再遞迴生成左右子樹。鍊錶的構造要稍微繞一些,因為要通過中序遍歷走到第乙個結點,然後遞進鍊錶。
這篇總結主要介紹leetcode中關於二叉查詢樹的題目,二叉查詢樹因為是基本資料結構加上有可利用的有序性質,還是在面試中相當常見的,對於性質理解要深刻,實現要熟練哈。
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...
二叉樹 二叉查詢樹
二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...
樹(樹,二叉樹,二叉查詢樹)
1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...