《劍指offer》筆記 第4章(4)

2021-08-04 07:54:26 字數 1669 閱讀 3573

面試題36:二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將二叉搜尋樹轉換成乙個排序的雙向鍊錶,要求不能建立任何新的節點,只能調整樹中的節點指標指向。

測試用例:

功能測試:完全二叉樹、只有左/右子樹、只有乙個節點的二叉樹

特殊輸入:二叉樹根節點是null

分析:

1.    二叉樹中每個節點有兩個指標分別指向左子節點和右子節點,雙向鍊錶中每個節點有兩個指標分別指向其前、後節點;因此可以將二叉搜尋樹轉換成雙向鍊錶;

2.    對二叉搜尋樹的每個節點來說,前向指標指向的元素是其左子樹的最大元素,後向指標指向的元素是其右子樹的最小元素;

3.    可用遞迴來解決問題;

4.    要使雙向鍊錶要中序遍歷;

5.    左節點遞迴處理,中節點設定當前節點的左指標指向上乙個遍歷的節點,設定上乙個節點的右指標指向該中節點;右節點遞迴處理;

6.    轉換完所有指標後,需要返回鍊錶的頭節點;

面試題37:序列化二叉樹

實現兩個函式,分別用來序列化和反序列化二叉樹;

序列化時要記下null指標,如null指標可用『$』表示;

序列化:將一棵二叉樹前序遍歷輸出乙個序列,如1,2,4,$,$,$,3,5,$,$,6,$,$;

反序列化:將乙個序列變成一棵二叉樹。

測試用例:

功能測試:完全二叉樹、只有左/右子樹、只有乙個節點的二叉樹、節點值都相同;

特殊輸入:二叉樹根節點是null

分析:

1.    把二叉樹分為3個部分,根節點、左子樹、右子樹;

2.    處理完根節點後,在分別處理左子樹(遞迴)、右子樹(遞迴)

面試題38:字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。例如,輸入abc則列印出a、b、c的所有排列:abc、acb、bac、bca、cab、cba。

測試用例:

功能測試:字串有1個、多個字元;

特殊輸入:輸入字串內容為空、輸入null

分析:

1.    第一步求所有可能出現在第乙個位置的字元;

2.    第二步,固定第乙個字元,求後面字元的排列;而後面的字元又可以分為第乙個字元和後面的字元;

擴充套件

不是求字元的排列,而是求字元的所有組合,例如a、b、c,所有的組合有:a、b、c、ab、ac、bc、abc。

分析:

1.    求n個字元組成長度為m的組合:

2.    將n個字元分成兩部分,第乙個字元和其餘所有字元;

3.    如果組合裡包含第乙個字元,則下一步在剩餘n-1個字元裡選取m-1個字元;

4.    如果組合裡不包含第乙個字元,則下一步在剩餘n-1個字元裡選取m個字元;

解決複雜問題的方法:畫圖、舉例、分解;

遇到鍊錶、二叉樹等資料結構時,畫圖可變得直觀;

遇到抽象的問題,舉例子找到規律;

大問題分解成若干小問題,遞迴地解決這些小問題;

分治法、動態規劃等思路都可以解決複雜問題;

《劍指offer》筆記 第三章 4

面試題24 翻轉鍊錶 定義乙個函式,輸入乙個鍊錶的頭節點,翻轉該鍊錶並輸出翻轉後的頭節點。struct listnode 測試用例 功能測試 輸入的鍊錶含多個節點 乙個節點 特殊輸入 鍊錶是null 分析 2.翻轉後的頭指標要指向翻轉前的尾節點 翻轉後的尾節點的要指向null 面試題25 合併兩個排...

劍指offer 題目4

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。pre vin 前序列表中第乙個是二叉樹的根節點,由於題目中資料都不重複,那麼我們找到中序列表中的根節點的位置,那麼左邊部分就是左子...

《劍指offer》筆記 第5章(2)

面試題42 連續子陣列的最大和 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度是o n 例如,陣列為,和最大的子陣列為,輸出位18。測試用例 功能測試 陣列中有正數也有負數 陣列中只有正數 陣列中只有負數 特殊輸入 陣列為nu...