經典面試題目:二叉樹遍歷
一、 核心定義與性質
二叉樹(Binary Tree) 是一種每個節點最多有兩個子節點的樹形結構。這兩個子節點通常被稱為左子節點和右子節點。
關鍵術語:
- 根節點(Root): 樹的頂層節點,沒有父節點。
- 葉子節點(Leaf): 沒有子節點的節點。
- 深度(Depth): 從根節點到該節點所經歷的邊的個數。
- 高度(Height): 從該節點到最深葉子節點所經歷的邊的個數。樹的高度是根節點的高度。
- 子樹(Subtree): 任何一個節點及其所有后代節點也可以構成一棵二叉樹,稱為子樹。
二、 二叉樹的種類(測試關注的重點)
不同類型的二叉樹具有不同的性質和性能表現,這是測試時需要重點關注的。
| 類型 | 描述 | 測試關注點 |
|---|---|---|
| 滿二叉樹(Full Binary Tree) | 每個節點都有0個或2個子節點。 | 結構完整性測試。 |
| 完全二叉樹(Complete Binary Tree) | 除最后一層外,所有層都完全填滿,且最后一層的節點都向左對齊。 | 高效數組存儲(堆結構的基礎)。測試其構建和調整過程。 |
| 完美二叉樹(Perfect Binary Tree) | 所有葉子節點都在同一層,且每個非葉子節點都有兩個子節點。 | 理想情況,常用于計算樹的高度和節點數關系(第k層有$2^{k-1}$個節點)。 |
| 平衡二叉樹(Balanced Binary Tree) | 任何節點的左右兩個子樹的高度差絕對值不超過1(AVL樹)或通過算法維持平衡(紅黑樹)。 | 核心!性能保證的關鍵。 測試插入、刪除操作后是否能通過旋轉等操作重新平衡,以保證最壞情況下時間復雜度仍為O(log n)。 |
| 二叉搜索樹(BST, Binary Search Tree) | 一種有序的二叉樹。對于任意節點,其左子樹上所有節點的值都小于它,其右子樹上所有節點的值都大于它。 | 核心! 測試其順序性是否在任何操作后都得以維持。測試查找、插入、刪除功能。 |
三、 遍歷方式(測試用例設計的核心)
遍歷是訪問樹中所有節點的過程。不同的遍歷順序會產生不同的輸出,這是驗證樹結構是否正確的重要手段。
| 遍歷方式 | 訪問順序 | 應用場景 | 測試驗證點 |
|---|---|---|---|
| 前序遍歷(Pre-order) | 根 -> 左 -> 右 | 用于復制一棵樹(先復制根節點)。 | 驗證樹的結構是否與預期一致。 |
| 中序遍歷(In-order) | 左 -> 根 -> 右 | 對BST非常重要! 會以升序訪問所有節點。 | 這是測試BST是否正確實現的最重要方法。 只要中序遍歷結果是升序序列,就基本證明BST的順序性質得以保持。 |
| 后序遍歷(Post-order) | 左 -> 右 -> 根 | 用于先刪除子節點再刪除父節點的場景(如釋放內存)。 | 驗證子樹操作是否已完成。 |
| 層序遍歷(Level-order) | 從上到下,從左到右 | 按層次處理節點。 | 驗證完全二叉樹的性質,或用于尋找最短路徑(如BFS)。 |
面試題目
問題1: 二叉樹遍歷
給定一棵二叉樹的前序遍歷序列和中序遍歷序列,請你求出該二叉樹的后序遍歷序列。
輸入:
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
解析:
- 前序遍歷 (Preorder Traversal)遍歷順序:根節點 → 左子樹 → 右子樹
- 中序遍歷 (Inorder Traversal)遍歷順序:左子樹 → 根節點 → 右子樹
- 后序遍歷 (Postorder Traversal) 遍歷順序:左子樹 → 右子樹 → 根節點
答案:后序遍歷:[9,15,7,20,3]
問題2: “如何測試一個二叉搜索樹(BST)的實現?”
-
基礎功能驗證:
- 插入與查找: 測試插入一系列值后,能否正確找到存在的值和不存在的值。
- 刪除: 覆蓋三種情況:刪除葉子節點、刪除有一個子節點的節點、刪除有兩個子節點的節點。每次刪除后都要驗證樹的結構。
- 核心驗證手段: 中序遍歷。這是測試BST的‘銀彈’。無論進行多少次插入或刪除,只要中序遍歷輸出的序列是嚴格升序的,就能基本證明BST的核心性質——順序性——沒有被破壞。
-
邊界和異常測試:
- 操作空樹。
- 插入重復值(根據需求規格說明,測試是忽略、覆蓋還是報錯)。
- 插入極值(非常大或非常小的數字)。
- 嘗試刪除一個不存在的節點。
-
性能測試:
- 平衡性測試: 構造隨機數據和構造有序數據分別進行插入。對于有序數據,一個優質的BST(如AVL樹、紅黑樹)應該通過自平衡操作保持樹的大致平衡,確保查找效率維持在O(log n)。如果樹退化成鏈表,性能會下降到O(n),這是一個重要的測試點。
- 壓力測試:插入大量數據,驗證內存使用和操作耗時是否符合預期。
-
健壯性測試(如果適用):
- 考慮并發環境下多個線程同時讀寫BST的情況,測試是否需要額外的同步機制,以及是否存在競態條件。”
作者:AmyZYX
出處:http://www.rzrgm.cn/amyzhu/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
出處:http://www.rzrgm.cn/amyzhu/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

浙公網安備 33010602011771號