面試題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...