1.二叉樹的映象
二叉樹的映象:輸入乙個二叉樹,輸出它的映象
分析:求樹的映象過程其實就是在遍歷樹的同時,交換非葉結點的左右子結點。
求映象的過程:先前序遍歷這棵樹的每個結點,如果遍歷到的結點有子結點,交換它的兩個子結點,當交換完所有非葉子結點的左右子結點之後,就得到了樹的映象。
1/*2struct treenode 9};
*/10
class
solution
29 };
2.順時針列印矩陣
分析:/*解題思路:順時針列印就是按圈數迴圈列印,一圈包含兩行或者兩列,在列印的時候會出現某一圈中只包含一行,
要判斷從左向右列印和從右向左列印的時候是否會出現重複列印,
同樣只包含一列時,要判斷從上向下列印和從下向上列印的時候是否會出現重複列印的情況*/
1class
solution
23return
res;24}
25 };
3.包含min函式的棧
定義棧的資料結構,請在該型別中實現乙個能夠得到棧最小元素的min函式。
1/*2* 1.datastack為儲存資料的棧,minstack為儲存最小值的棧;
3* 2.push的時候將value值與minstack中的top值比較,小則minstack push value,大則push top值4*/
5class
solution
15else
//如果資料小於min,資料壓入輔助棧,否則最小值壓入輔助棧
162021}
22void pop() //
出棧23
27int top() //
棧頂28
31int min() //
取最小32
35 };
4、棧的壓入、彈出序列
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
分析:可以找到判斷乙個序列是不是棧的彈出序列的規律:如果下乙個彈出的數字剛好是棧頂數字,那麼直接彈出。
如果下乙個彈出的數字不在棧頂,我們把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下乙個需要彈出的數字壓入棧頂為止。
如果把所有的數字都壓入棧仍然沒有找到下乙個彈出的數字,那麼該序列不可能是乙個彈出序列。
/*c++
模擬堆疊操作:將原數列依次壓棧,棧頂元素與所給出棧佇列相比,如果相同則出棧,
如果不同則繼續壓棧,直到原數列中所有數字壓棧完畢。
檢測棧中是否為空,若空,說明出棧佇列可由原數列進行棧操作得到。否則,說明出棧佇列不能由原數列進行棧操作得到。
*/
1class
solution 17}
18if
(s.empty())
19return
true;20
return
false;21
}22 };
5.從上往下列印二叉樹從上往下列印出二叉樹的每個節點,同層節點從左至右列印。
分析:
每一次列印乙個結點的時候,如果該結點有子結點,則把該結點的子結點放入乙個佇列的末尾。
接下來到佇列的頭部去除最早進入佇列的結點,重複前面的列印操作,直到佇列中所有的結點都被列印出來為止。
1class
solution
18return
r;19
}20 };
6.二叉搜尋樹的後序遍歷序列輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。
分析:在後序遍歷得到的序列中,最後乙個數字是樹的根結點的值。
陣列中前面的數字可以分為兩部分:第一部分是左子樹結點的值,他們都比根結點的值小,第二部分是右子樹結點的值,他們的值都比根結點的值大。
//1、確定root;
//2、遍歷序列(除去root結點),找到第乙個大於root的位置,則該位置左邊為左子樹,右邊為右子樹;
//3、遍歷右子樹,若發現有小於root的值,則直接返回false;
//4、分別判斷左子樹和右子樹是否仍是二叉搜尋樹(即遞迴步驟1、2、3)。
1class
solution
17for(int j=i;j1;++j) //
迴圈時去除root,因此為len-1
1822
23if(i!=0)24
30}31if(i!=len-2)32
37}3839
bool left = true,right = true; //
看左右子樹是否是二叉搜尋樹
40if(lefttree.size()>1
) verifysquenceofbst(lefttree);
41if(righttree.size()>1
) verifysquenceofbst(righttree);
4243
return (left&&right);44}
45 };
7.二叉樹中和為某一值的路徑: 注:路徑是從根結點出發到葉結點。
//非遞迴版本
//思路:
//1.按先序遍歷把當前節點cur的左孩子依次入棧同時儲存當前節點,每次更新當前路徑的和sum;
//2.判斷當前節點是否是葉子節點以及sum是否等於expectnumber,如果是,把當前路徑放入結果中。
//3.遇到葉子節點cur更新為null,此時看棧頂元素,如果棧頂元素的把棧頂元素儲存在last變數中,同時彈出棧頂元素,當期路徑中棧頂元素彈出,
//sum減掉棧頂元素,這一步驟不更改cur的值;
//4.如果步驟3中的棧頂元素的右孩子存在且右孩子之前沒有遍歷過,當前節點cur更新為棧頂的右孩子,此時改變cur=null的情況。
1/*2struct treenode 9};
*/10
class
solution
32else
33 39}
40else
4149 cur = cur->left; //
先序遍歷,左子樹先於右子樹50}
51}52return
res;
5354
}55 };
8.複雜鍊錶的複製
輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。
(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
1/*2struct randomlistnode 8};
9*/10class
solution 24}
2526
void connectsiblingnodes(randomlistnode*phead)
2735 pnode=pcloned->next;36}
37}3839 randomlistnode* reconnectnodes(randomlistnode*phead)
4051
52while(pnode!=null)
5359
return
pclonedhead;60}
61 randomlistnode* clone(randomlistnode*phead)
6267 };
9.二叉搜尋樹與雙向鍊錶
輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶(要求不能建立新的結點,只能調整樹中結點指標的指向)
分析:在搜尋二叉樹中,左子結點的值總是小於父節點的值,右子節點的值總是大於父節點的值。因此我們在轉換成排序雙向鍊錶時,原先指向左子節點的指標調整為鍊錶中指向前乙個結點的指標,原先指向右子節點的指標調整為鍊錶中指向後乙個結點指標。
1/*2struct treenode 9};
*/10
class
solution
26 treenode* convert(treenode*prootoftree)
2735 };
10.字串的排列
輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
遞迴思路:分為兩步,首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有字元交換。第二步固定第乙個字元,求後面所有字元的排列。
仍然分為兩部分:後面字元的第乙個字元,以及這個字元之後的所有字元。然後把第乙個字元逐一和它後面字元交換。
1class
solution
11for (int i = pos; i < str.length(); ++i)
1217
}18 vector permutation(string
str)
29 };
第四章 繼承
一 為什麼要繼承 在物件導向中我們將具有很多重複內容的類中的內容提取出來,寫成乙個單獨的類 其他類只需要繼承就能取得這些功能,同時可以在自己類中寫入獨特的自定義方法 二 繼承語法 inte ce circle nsobject 繼承是在介面中定義的 冒號後的類名是要整合的類,nsobject 是co...
第四章 物件
三個特性 身份 型別 值 每個物件都有唯一的身份來標識自己,使用內建函式id 得到。例子 usr bin env python coding utf 8 a 32 print a b a print id a id b 結果 d python27 python.exe e workp python ...
第四章 其他
sizeof和strlen 區別sizeof以位元組為單位給出資料的大小,strlen 函式以字元為單位給出字串的長度。使用strlen 函式要加 include標頭檔案。sizeof計算字元時會將標誌字串結束的不可見的空字元計算在內。定義符號常量 方法一 define name value 優點 ...