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