劍指offer刷題 16

2021-10-21 03:17:49 字數 3852 閱讀 2100

面試題32:從上到下列印二叉樹

題目1:不分行從上到下列印二叉樹。

從上到下列印二叉樹的每個節點,同一層的節點按照從左到右的順序列印。

struct binarytreenode

這種遍歷是按層遍歷

規律 每次列印乙個節點時,如果該節點有子節點,則把該節點的子節點放到乙個佇列的末尾,

void

printfromtobottom

(binarytreenode* ptreeroot)

}

題目3:之字形列印二叉樹

請實現乙個函式按照之字形順序列印二叉樹,

void

print

(binarytreenode* proot)

else

if(levels[current]

.empty()

)}}

面試題33:二叉搜尋樹的後序遍歷序列

輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果。如果是則返回true,否則返回false。

bool

verifysquenceofbst

(int sequence,

int length)

int j = i;

for(

;j++j)

bool left=

true;if

(i>0)

left =

verifysquenceofbst

(sequence,i)

;bool right =

true;if

(iright =

verifysquenceofbst

(sequence+i,length -i-1)

;return

(left&&right)

;}

面試題34:二叉樹中和為某一值的路徑

輸入一顆二叉樹和乙個整數,列印出二叉樹中節點值的和為輸入整數的所有路徑。從樹的根節點開始一直到葉節點所經過的節點形成一條路徑,

二叉樹節點定義如下:

struct binarytreenode

當用前序遍歷的方式訪問某一節點時,我們把該節點新增到路徑上,並累加該節點的值,

如果該節點為葉子節點,並且符合條件列印出來,,

void

findpath

(binarytreenode* proot,

int expectedsum)

void

findepath

(binarytreenode* proot,

int expectedsum,std::vector<

int>

&path,

int currentsum)

if(proot-

>m_pleft!=

nullptr

)findpath

(proot-

>m_pleft,expectedsum,path,currentsum);if

(proot-

>m_pright !=

nullptr

)finpath

(proot-

>m-pright,expectedsum,path,currentsum)

; path.

pop_back()

;}

4.4 分解讓複雜問題簡單化

把大問題分解成若干個簡單的小問題,逐個解決這些小問題。計算機領域演算法分治演算法,

面試題35:複雜鍊錶的複製

請實現complexlistnode* clone(complexlistnode* phead), 複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個m_pnext指標指向下乙個節點,還有乙個m_psibling指標指向鍊錶中的任意節點或者nullptr。

struct complexlistnode

;

第一步,根據原始鍊錶的每個節點n建立對應的n』.

第二步,設定複製出來的節點 m_psibling,假設原始鍊錶上的n的m_psibling指向節點s,那麼其對應複製出來的n』是n的m_pnext指向的節點。

第三步,把長鍊錶拆分成兩個鍊錶,把奇數字置的節點用m_pnext連線起來就是原始鍊錶,把偶數字置的節點用m_pnext鏈結起來就是複製出來的鍊錶。

void

clonenodes

(complexlistnode* phead)

}

void

connectsiblingnodes

(complexlistnode* phead)

pnode=pcloned-

>m_pnext;

}}

complexlistnode*

reconnectnodes

(complexlistnode* phead)

while

(pnode !=

nullptr

)return pclonedhead;

}complexlistnode*

clone

(complexlistnode* phead)

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

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

struct binarytreenode

;

按照中序遍歷的順序,當我們遍歷轉換到根節點時,它的左子樹已經轉換成乙個排序的鍊錶了,並且在鍊錶中的最後乙個節點是當前值最大的節點。

binarytrenode*

convert

(binarytreenode* prootoftree)

void

convertnode

(binarytreenode* pnode,binarytreenode*

* plastnodeinlist)

考察分析複雜問題的能力,無論是二叉樹還是雙向鍊錶,都有很多指標。要實現不同資料結構之間的轉換,需要調整大量的指標,因此過程很複雜。

面試題37:序列化二叉樹

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

void

serialize

(binarytrenode* proot,ostream& stream)

stream<>m_nvalue<<

',';

serialize

(proot-

>m_pleft,stream)

;serialize

(proot-

>m_pright,stream);}

void

deserialize

(binarytreenode*

* proot,istream& stream)

}

面試題38:字串的排列

輸入乙個字串,列印出該字串中所有字元的所有排列,

void

permutation

(char

* pstr)

void

permutation

(char

* pstr,

char

* pbegin)

else

}}

劍指offer刷題

面試題6 從尾到頭列印鍊錶 struct listnode class solution reverse res.begin res.end return res 替換空格class solution int newnumstr numstr numspace 2 if newnumstr leng...

劍指offer刷題

原題鏈結 動態規劃 class solution dp for int i 1 i len1 i else if p j 1 else return dp len1 len2 原題鏈結 數學推導 找規律 class solution else if n 3 2 return ipow 3 numso...

劍指offer刷題 2

思路 如果從前往後進行遍歷,那麼每次找到乙個空格,則需要新增兩個位元組來進行替換,我們採用先對字串進行遍歷,查詢字串中的空格的個數,然後對新的字串進行長度的計算,然後從後往前進行替換,每遇到乙個空字元,然後進行替換。class solution int oldnumber 0 int numbers...