




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上樹(shù)是一種比較重要的數(shù)據(jù)結(jié)構(gòu),尤其是二叉樹(shù)。二叉樹(shù)是一種特殊的樹(shù),在二叉樹(shù)中每個(gè)節(jié)點(diǎn)最多有兩個(gè)子節(jié)點(diǎn),一般稱為左子節(jié)點(diǎn)和右子節(jié)點(diǎn)(或左孩子和右孩子),并且二叉樹(shù)的子樹(shù)有左右之分,其次序不能任意顛倒。二叉樹(shù)是遞歸定義的,因此,與二叉樹(shù)有關(guān)的題目基本都可以用遞歸思想解決,當(dāng)然有些題目非遞歸解法也應(yīng)該掌握,如非遞歸遍歷節(jié)點(diǎn)等等。本文努力對(duì)二叉樹(shù)相關(guān)題目做一個(gè)較全的整理總結(jié),希望對(duì)找工作的同學(xué)有所幫助。二叉樹(shù)節(jié)點(diǎn)定義如下:struct BinaryTreeNode int m_nValue; BinaryTreeNode* m
2、_pLeft; BinaryTreeNode* m_pRight;相關(guān)鏈接:題目列表:詳細(xì)解答1. 求二叉樹(shù)中的節(jié)點(diǎn)個(gè)數(shù)遞歸解法:(1)如果二叉樹(shù)為空,節(jié)點(diǎn)個(gè)數(shù)為0(2)如果二叉樹(shù)不為空,二叉樹(shù)節(jié)點(diǎn)個(gè)數(shù) = 左子樹(shù)節(jié)點(diǎn)個(gè)數(shù) + 右子樹(shù)節(jié)點(diǎn)個(gè)數(shù) + 1參考代碼如下:1. int GetNodeNum(BinaryTreeNode * pRoot) 2. 3. if(pRoot = NULL) / 遞歸出口
3、160; 4. return 0; 5. return GetNodeNum(pRoot->m_pLeft) + GetNodeNum(pRoot->m_pRight) + 1; 6. 2. 求二叉樹(shù)的深度遞歸解法:(1)如果二叉樹(shù)為空,二叉樹(shù)的深度為0(2)如果二叉樹(shù)不為空,二叉樹(shù)的深度 = max(左
4、子樹(shù)深度, 右子樹(shù)深度) + 1參考代碼如下:1. int GetDepth(BinaryTreeNode * pRoot) 2. 3. if(pRoot = NULL) / 遞歸出口 4. return 0; 5. int d
5、epthLeft = GetDepth(pRoot->m_pLeft); 6. int depthRight = GetDepth(pRoot->m_pRight); 7. return depthLeft > depthRight ? (depthLeft + 1) : (depthRight
6、60;+ 1); 8. 3. 前序遍歷,中序遍歷,后序遍歷前序遍歷遞歸解法:(1)如果二叉樹(shù)為空,空操作(2)如果二叉樹(shù)不為空,訪問(wèn)根節(jié)點(diǎn),前序遍歷左子樹(shù),前序遍歷右子樹(shù)參考代碼如下:1. void PreOrderTraverse(BinaryTreeNode * pRoot) 2. 3. if(pRoot = NULL) 4.
7、0; return; 5. Visit(pRoot); / 訪問(wèn)根節(jié)點(diǎn) 6. PreOrderTraverse(pRoot->m_pLeft); / 前序遍歷左子樹(shù) 7. PreOrderTraverse(pRoot->m_pRight); / 前序遍歷右子樹(shù)
8、 8. 中序遍歷遞歸解法(1)如果二叉樹(shù)為空,空操作。(2)如果二叉樹(shù)不為空,中序遍歷左子樹(shù),訪問(wèn)根節(jié)點(diǎn),中序遍歷右子樹(shù)參考代碼如下:1. void InOrderTraverse(BinaryTreeNode * pRoot) 2. 3. if(pRoot = NULL) 4. retur
9、n; 5. InOrderTraverse(pRoot->m_pLeft); / 中序遍歷左子樹(shù) 6. Visit(pRoot); / 訪問(wèn)根節(jié)點(diǎn) 7. InOrderTraverse(pRoot->m_pRight); / 中序遍歷右子樹(shù) 8. 后序遍歷遞歸解法(1)如
10、果二叉樹(shù)為空,空操作(2)如果二叉樹(shù)不為空,后序遍歷左子樹(shù),后序遍歷右子樹(shù),訪問(wèn)根節(jié)點(diǎn)參考代碼如下:1. void PostOrderTraverse(BinaryTreeNode * pRoot) 2. 3. if(pRoot = NULL) 4. return; 5.
11、60;PostOrderTraverse(pRoot->m_pLeft); / 后序遍歷左子樹(shù) 6. PostOrderTraverse(pRoot->m_pRight); / 后序遍歷右子樹(shù) 7. Visit(pRoot); / 訪問(wèn)根節(jié)點(diǎn) 8. 4.分層遍歷二叉樹(shù)(按層次從上往下,從左往右)相當(dāng)于廣度優(yōu)先搜索,使用隊(duì)列實(shí)現(xiàn)。隊(duì)列初始化,
12、將根節(jié)點(diǎn)壓入隊(duì)列。當(dāng)隊(duì)列不為空,進(jìn)行如下操作:彈出一個(gè)節(jié)點(diǎn),訪問(wèn),若左子節(jié)點(diǎn)或右子節(jié)點(diǎn)不為空,將其壓入隊(duì)列。1. void LevelTraverse(BinaryTreeNode * pRoot) 2. 3. if(pRoot = NULL) 4. return; 5.
13、60;queue<BinaryTreeNode *> q; 6. q.push(pRoot); 7. while(!q.empty() 8. 9. BinaryTreeNode * pNode =
14、q.front(); 10. q.pop(); 11. Visit(pNode); / 訪問(wèn)節(jié)點(diǎn) 12. if(pNode->m_pLeft != NULL) 13.
15、; q.push(pNode->m_pLeft); 14. if(pNode->m_pRight != NULL) 15. q.push(pNode-&g
16、t;m_pRight); 16. 17. return; 18. 5. 將二叉查找樹(shù)變?yōu)橛行虻碾p向鏈表要求不能創(chuàng)建新節(jié)點(diǎn),只調(diào)整指針。例如如下的二叉搜索樹(shù),若采用中序遍歷,其遍歷順序?yàn)?-2-3-4-5-6-7,通過(guò)適當(dāng)?shù)闹羔樧儞Q操作,可變成的雙向有序鏈表如下:遞歸解法:(1)如果二叉樹(shù)查找樹(shù)為空,不需要轉(zhuǎn)換,對(duì)應(yīng)雙向鏈表的第一個(gè)節(jié)點(diǎn)是NULL,最后一個(gè)節(jié)點(diǎn)是NULL(2)如果二叉查找樹(shù)不為空:如果左子樹(shù)為空
17、,對(duì)應(yīng)雙向有序鏈表的第一個(gè)節(jié)點(diǎn)是根節(jié)點(diǎn),左邊不需要其他操作;如果左子樹(shù)不為空,轉(zhuǎn)換左子樹(shù),二叉查找樹(shù)對(duì)應(yīng)雙向有序鏈表的第一個(gè)節(jié)點(diǎn)就是左子樹(shù)轉(zhuǎn)換后雙向有序鏈表的第一個(gè)節(jié)點(diǎn),同時(shí)將根節(jié)點(diǎn)和左子樹(shù)轉(zhuǎn)換后的雙向有序鏈表的最后一個(gè)節(jié)點(diǎn)連接;如果右子樹(shù)為空,對(duì)應(yīng)雙向有序鏈表的最后一個(gè)節(jié)點(diǎn)是根節(jié)點(diǎn),右邊不需要其他操作;如果右子樹(shù)不為空,對(duì)應(yīng)雙向有序鏈表的最后一個(gè)節(jié)點(diǎn)就是右子樹(shù)轉(zhuǎn)換后雙向有序鏈表的最后一個(gè)節(jié)點(diǎn),同時(shí)將根節(jié)點(diǎn)和右子樹(shù)轉(zhuǎn)換后的雙向有序鏈表的第一個(gè)節(jié)點(diǎn)連接。參考代碼如下:1. /* 2. 參數(shù): 3. pRoot: 二叉查找樹(shù)根節(jié)點(diǎn)指針 4. pFirstNo
18、de: 轉(zhuǎn)換后雙向有序鏈表的第一個(gè)節(jié)點(diǎn)指針 5. pLastNode: 轉(zhuǎn)換后雙向有序鏈表的最后一個(gè)節(jié)點(diǎn)指針 6. */ 7. void Convert(BinaryTreeNode * pRoot, 8. BinaryTreeNode * & pFirstNode,
19、BinaryTreeNode * & pLastNode) 9. 10. BinaryTreeNode *pFirstLeft, *pLastLeft, * pFirstRight, *pLastRight; 11. if(pRoot = NULL) 12.
20、; 13. pFirstNode = NULL; 14. pLastNode = NULL; 15. return; 16.
21、; 17. 18. if(pRoot->m_pLeft = NULL) 19. 20. / 如果左子樹(shù)為空,對(duì)應(yīng)雙向有序鏈表的第一個(gè)節(jié)點(diǎn)是根節(jié)點(diǎn) 21. pFir
22、stNode = pRoot; 22. 23. else 24. 25. Convert(pRoot->m_pLeft, pFirstLeft, pLastLeft); 26.
23、; / 二叉查找樹(shù)對(duì)應(yīng)雙向有序鏈表的第一個(gè)節(jié)點(diǎn)就是左子樹(shù)轉(zhuǎn)換后雙向有序鏈表的第一個(gè)節(jié)點(diǎn) 27. pFirstNode = pFirstLeft; 28. / 將根節(jié)點(diǎn)和左子樹(shù)轉(zhuǎn)換后的雙向有序鏈表的最后一個(gè)節(jié)點(diǎn)連接 29.
24、; pRoot->m_pLeft = pLastLeft; 30. pLastLeft->m_pRight = pRoot; 31. 32. 33. if(pRoot->m_p
25、Right = NULL) 34. 35. / 對(duì)應(yīng)雙向有序鏈表的最后一個(gè)節(jié)點(diǎn)是根節(jié)點(diǎn) 36. pLastNode = pRoot; 37. 38.
26、 else 39. 40. Convert(pRoot->m_pRight, pFirstRight, pLastRight); 41. / 對(duì)應(yīng)雙向有序鏈表的最后一個(gè)節(jié)點(diǎn)就是右子樹(shù)轉(zhuǎn)換后雙向有序鏈表的最后一
27、個(gè)節(jié)點(diǎn) 42. pLastNode = pLastRight; 43. / 將根節(jié)點(diǎn)和右子樹(shù)轉(zhuǎn)換后的雙向有序鏈表的第一個(gè)節(jié)點(diǎn)連接 44. pRoot->m_pRight = pFirstRi
28、ght; 45. pFirstRight->m_pLeft= pRoot; 46. 47. 48. return; 49. 6. 求二叉樹(shù)第K層的節(jié)點(diǎn)個(gè)數(shù)遞歸解法:(1)如果二叉樹(shù)為空或者k<1返回0(2)如果二叉樹(shù)不為空并且k=1,返回1(3)如
29、果二叉樹(shù)不為空且k>1,返回左子樹(shù)中k-1層的節(jié)點(diǎn)個(gè)數(shù)與右子樹(shù)k-1層節(jié)點(diǎn)個(gè)數(shù)之和參考代碼如下:1. int GetNodeNumKthLevel(BinaryTreeNode * pRoot, int k) 2. 3. if(pRoot = NULL | k < 1) 4.
30、 return 0; 5. if(k = 1) 6. return 1; 7. int numLeft = GetNodeNumKthLevel(pRoot->m_pLeft, k-1); / 左子樹(shù)中k-1層的節(jié)點(diǎn)個(gè)數(shù)
31、60; 8. int numRight = GetNodeNumKthLevel(pRoot->m_pRight, k-1); / 右子樹(shù)中k-1層的節(jié)點(diǎn)個(gè)數(shù) 9. return (numLeft + numRight); 10. 7. 求二叉樹(shù)中葉子節(jié)點(diǎn)的個(gè)數(shù)遞歸解法:(1)如果二叉樹(shù)為空,返回0(2)如果二叉樹(shù)不為空且左右子
32、樹(shù)為空,返回1(3)如果二叉樹(shù)不為空,且左右子樹(shù)不同時(shí)為空,返回左子樹(shù)中葉子節(jié)點(diǎn)個(gè)數(shù)加上右子樹(shù)中葉子節(jié)點(diǎn)個(gè)數(shù)參考代碼如下:1. int GetLeafNodeNum(BinaryTreeNode * pRoot) 2. 3. if(pRoot = NULL) 4. return 0; 5. &
33、#160; if(pRoot->m_pLeft = NULL && pRoot->m_pRight = NULL) 6. return 1; 7. int numLeft = GetLeafNodeNum(pRoot->m_pLeft); /
34、160;左子樹(shù)中葉節(jié)點(diǎn)的個(gè)數(shù) 8. int numRight = GetLeafNodeNum(pRoot->m_pRight); / 右子樹(shù)中葉節(jié)點(diǎn)的個(gè)數(shù) 9. return (numLeft + numRight); 10. 8. 判斷兩棵二叉樹(shù)是否結(jié)構(gòu)相同不考慮數(shù)據(jù)內(nèi)容。結(jié)構(gòu)相同意味著對(duì)應(yīng)的左子樹(shù)和對(duì)應(yīng)的右子樹(shù)都結(jié)構(gòu)相同
35、。遞歸解法:(1)如果兩棵二叉樹(shù)都為空,返回真(2)如果兩棵二叉樹(shù)一棵為空,另一棵不為空,返回假(3)如果兩棵二叉樹(shù)都不為空,如果對(duì)應(yīng)的左子樹(shù)和右子樹(shù)都同構(gòu)返回真,其他返回假參考代碼如下:1. bool StructureCmp(BinaryTreeNode * pRoot1, BinaryTreeNode * pRoot2) 2. 3. if(pRoot1 = NULL && pRoo
36、t2 = NULL) / 都為空,返回真 4. return true; 5. else if(pRoot1 = NULL | pRoot2 = NULL) / 有一個(gè)為空,一個(gè)不為空,返回假 6. &
37、#160; return false; 7. bool resultLeft = StructureCmp(pRoot1->m_pLeft, pRoot2->m_pLeft); / 比較對(duì)應(yīng)左子樹(shù) 8. bool resultRight = StructureCmp(pRoot1->m_pRig
38、ht, pRoot2->m_pRight); / 比較對(duì)應(yīng)右子樹(shù) 9. return (resultLeft && resultRight); 10. 9. 判斷二叉樹(shù)是不是平衡二叉樹(shù)遞歸解法:(1)如果二叉樹(shù)為空,返回真(2)如果二叉樹(shù)不為空,如果左子樹(shù)和右子樹(shù)都是AVL樹(shù)并且左子樹(shù)和右子樹(shù)高度相差不大于1,返回真,其他返回假參考代碼:1. bool IsAVL(Binary
39、TreeNode * pRoot, int & height) 2. 3. if(pRoot = NULL) / 空樹(shù),返回真 4. 5. height = 0; 6.
40、60; return true; 7. 8. int heightLeft; 9. bool resultLeft = IsAVL(pRoot->m_pLeft, heightLeft); 10.
41、0; int heightRight; 11. bool resultRight = IsAVL(pRoot->m_pRight, heightRight); 12. if(resultLeft && resultRight && abs(heightLeft - heightRight)
42、 <= 1) / 左子樹(shù)和右子樹(shù)都是AVL,并且高度相差不大于1,返回真 13. 14. height = max(heightLeft, heightRight) + 1; 15. return
43、 true; 16. 17. else 18. 19. height = max(heightLeft, heightRight) + 1; 20.
44、 return false; 21. 22. 10. 求二叉樹(shù)的鏡像遞歸解法:(1)如果二叉樹(shù)為空,返回空(2)如果二叉樹(shù)不為空,求左子樹(shù)和右子樹(shù)的鏡像,然后交換左子樹(shù)和右子樹(shù)參考代碼如下:1. BinaryTreeNode * Mirror(BinaryTreeNode * pRoot) 2. 3.
45、 if(pRoot = NULL) / 返回NULL 4. return NULL; 5. BinaryTreeNode * pLeft = Mirror(pRoot->m_pLeft); / 求左子樹(shù)鏡像 6. &
46、#160;BinaryTreeNode * pRight = Mirror(pRoot->m_pRight); / 求右子樹(shù)鏡像 7. / 交換左子樹(shù)和右子樹(shù) 8. pRoot->m_pLeft = pRight; 9. pRoot->
47、;m_pRight = pLeft; 10. return pRoot; 11. 11. 求二叉樹(shù)中兩個(gè)節(jié)點(diǎn)的最低公共祖先節(jié)點(diǎn)參考代碼如下:1. bool FindNode(BinaryTreeNode * pRoot, BinaryTreeNode * pNode) 2. 3. if(pRoot&
48、#160;= NULL | pNode = NULL) 4. return false; 5. 6. if(pRoot = pNode) 7. return true;
49、 8. 9. bool found = FindNode(pRoot->m_pLeft, pNode); 10. if(!found) 11. found = FindNode(pRoot->m_pRight, pNode);
50、;12. 13. return found; 14. 15. 16. BinaryTreeNode * GetLastCommonParent(BinaryTreeNode * pRoot, 17.
51、60; BinaryTreeNode * pNode1, 18. &
52、#160; BinaryTreeNode * pNode2) 19. 20. if(FindNode(pRoot->m_pLeft, pNode1) 21. 22
53、. if(FindNode(pRoot->m_pRight, pNode2) 23. return pRoot; 24. else 25.
54、0; return GetLastCommonParent(pRoot->m_pLeft, pNode1, pNode2); 26. 27. else 28. 29.
55、60; if(FindNode(pRoot->m_pLeft, pNode2) 30. return pRoot; 31. else 32.
56、0; return GetLastCommonParent(pRoot->m_pRight, pNode1, pNode2); 33. 34. 遞歸解法效率很低,有很多重復(fù)的遍歷,下面看一下非遞歸解法。非遞歸解法:先求從根節(jié)點(diǎn)到兩個(gè)節(jié)點(diǎn)的路徑,然后再比較對(duì)應(yīng)路徑的節(jié)點(diǎn)就行,最后一個(gè)相同的節(jié)點(diǎn)也就是他們?cè)诙鏄?shù)中的最低公共祖先節(jié)點(diǎn)參考代碼如下:1. bool GetNodePath(Bin
57、aryTreeNode * pRoot, BinaryTreeNode * pNode, 2. list<BinaryTreeNode *> & path) 3. 4.
58、;if(pRoot = pNode) 5. return true; 6. if(pRoot = NULL) 7. return false; 8. path.pu
59、sh_back(pRoot); 9. bool found = false; 10. found = GetNodePath(pRoot->m_pLeft, pNode, path); 11. if(!found) 12.
60、0; found = GetNodePath(pRoot->m_pRight, pNode, path); 13. if(!found) 14. path.pop_back(); 15. return found; 16.
61、60;17. BinaryTreeNode * GetLastCommonParent(BinaryTreeNode * pRoot, 18.
62、; BinaryTreeNode * pNode1, 19.
63、60; BinaryTreeNode * pNode2) 20. 21. if(pRoot = NULL | pNode1 = NULL | pNode2 = NULL) 22. return NULL; 23.
64、 24. list<BinaryTreeNode*> path1; 25. GetNodePath(pRoot, pNode1, path1); 26. list<BinaryTreeNode*> path2; 27. GetNodePath(pRoot,
65、pNode2, path2); 28. 29. BinaryTreeNode * pLast = NULL; 30. list<BinaryTreeNode*>:const_iterator iter1 = path1.begin(); 31. list<Binary
66、TreeNode*>:const_iterator iter2 = path2.begin(); 32. while(iter1 != path1.end() && iter2 != path2.end() 33. 34. if
67、(*iter1 = *iter2) 35. pLast = *iter1; 36. else 37. brea
68、k; 38. iter1+; 39. iter2+; 40. 41. 42. return pLast; 43. 在上述算法的基礎(chǔ)上稍加變化即
69、可求二叉樹(shù)中任意兩個(gè)節(jié)點(diǎn)的距離了。12. 求二叉樹(shù)中節(jié)點(diǎn)的最大距離即二叉樹(shù)中相距最遠(yuǎn)的兩個(gè)節(jié)點(diǎn)之間的距離。遞歸解法:(1)如果二叉樹(shù)為空,返回0,同時(shí)記錄左子樹(shù)和右子樹(shù)的深度,都為0(2)如果二叉樹(shù)不為空,最大距離要么是左子樹(shù)中的最大距離,要么是右子樹(shù)中的最大距離,要么是左子樹(shù)節(jié)點(diǎn)中到根節(jié)點(diǎn)的最大距離+右子樹(shù)節(jié)點(diǎn)中到根節(jié)點(diǎn)的最大距離,同時(shí)記錄左子樹(shù)和右子樹(shù)節(jié)點(diǎn)中到根節(jié)點(diǎn)的最大距離。參考代碼如下:1. int GetMaxDistance(BinaryTreeNode * pRoot, int & maxLeft, i
70、nt & maxRight) 2. 3. / maxLeft, 左子樹(shù)中的節(jié)點(diǎn)距離根節(jié)點(diǎn)的最遠(yuǎn)距離 4. / maxRight, 右子樹(shù)中的節(jié)點(diǎn)距離根節(jié)點(diǎn)的最遠(yuǎn)距離 5. if(pRoot = NULL) 6.
71、0; 7. maxLeft = 0; 8. maxRight = 0; 9. return 0; 10.
72、0;11. int maxLL, maxLR, maxRL, maxRR; 12. int maxDistLeft, maxDistRight; 13. if(pRoot->m_pLeft != NULL) 14. 15.
73、0; maxDistLeft = GetMaxDistance(pRoot->m_pLeft, maxLL, maxLR); 16. maxLeft = max(maxLL, maxLR) + 1; 17. 1
74、8. else 19. 20. maxDistLeft = 0; 21. maxLeft = 0; 22. 2
75、3. if(pRoot->m_pRight != NULL) 24. 25. maxDistRight = GetMaxDistance(pRoot->m_pRight, maxRL, maxRR); 26.
76、; maxRight = max(maxRL, maxRR) + 1; 27. 28. else 29. 30. maxDistRight = 0;
77、160;31. maxRight = 0; 32. 33. return max(max(maxDistLeft, maxDistRight), maxLeft+maxRight); 34. 13. 由前序遍歷序列和中序遍歷序列重建二叉樹(shù)二叉樹(shù)前序遍歷序列中,第一個(gè)
78、元素總是樹(shù)的根節(jié)點(diǎn)的值。中序遍歷序列中,左子樹(shù)的節(jié)點(diǎn)的值位于根節(jié)點(diǎn)的值的左邊,右子樹(shù)的節(jié)點(diǎn)的值位于根節(jié)點(diǎn)的值的右邊。遞歸解法:(1)如果前序遍歷為空或中序遍歷為空或節(jié)點(diǎn)個(gè)數(shù)小于等于0,返回NULL。(2)創(chuàng)建根節(jié)點(diǎn)。前序遍歷的第一個(gè)數(shù)據(jù)就是根節(jié)點(diǎn)的數(shù)據(jù),在中序遍歷中找到根節(jié)點(diǎn)的位置,可分別得知左子樹(shù)和右子樹(shù)的前序和中序遍歷序列,重建左右子樹(shù)。1. BinaryTreeNode * RebuildBinaryTree(int* pPreOrder, int* pInOrder, int nodeNum)
79、2. 3. if(pPreOrder = NULL | pInOrder = NULL | nodeNum <= 0) 4. return NULL; 5. BinaryTreeNode * pRoot&
80、#160;= new BinaryTreeNode; 6. / 前序遍歷的第一個(gè)數(shù)據(jù)就是根節(jié)點(diǎn)數(shù)據(jù) 7. pRoot->m_nValue = pPreOrder0; 8. pRoot->m_pLeft = NULL; 9. pRoot-&
81、gt;m_pRight = NULL; 10. / 查找根節(jié)點(diǎn)在中序遍歷中的位置,中序遍歷中,根節(jié)點(diǎn)左邊為左子樹(shù),右邊為右子樹(shù) 11. int rootPositionInOrder = -1; 12. for(int i = 0; i < nodeNum;
82、60;i+) 13. if(pInOrderi = pRoot->m_nValue) 14. 15. rootPositionInOrder = i;
83、 16. break; 17. 18. if(rootPositionInOrder = -1) 19. 20.
84、160; throw std:exception("Invalid input."); 21. 22. / 重建左子樹(shù) 23. int nodeNumLeft = rootPositionInOrder; 24. &
85、#160; int * pPreOrderLeft = pPreOrder + 1; 25. int * pInOrderLeft = pInOrder; 26. pRoot->m_pLeft = RebuildBinaryTree(pPreOrderLeft, pInOrderLeft,
86、 nodeNumLeft); 27. / 重建右子樹(shù) 28. int nodeNumRight = nodeNum - nodeNumLeft - 1; 29. int * pPreOrderRight = pPreOrder + 1
87、60;+ nodeNumLeft; 30. int * pInOrderRight = pInOrder + nodeNumLeft + 1; 31. pRoot->m_pRight = RebuildBinaryTree(pPreOrderRight, pInOrderRight, nodeNumRight);
88、; 32. return pRoot; 33. 同樣,有中序遍歷序列和后序遍歷序列,類似的方法可重建二叉樹(shù),但前序遍歷序列和后序遍歷序列不同恢復(fù)一棵二叉樹(shù),證明略。14.判斷二叉樹(shù)是不是完全二叉樹(shù)若設(shè)二叉樹(shù)的深度為h,除第 h 層外,其它各層 (1h-1) 的結(jié)點(diǎn)數(shù)都達(dá)到最大個(gè)數(shù),第 h 層所有的結(jié)點(diǎn)都連續(xù)集中在最左邊,這就是完全二叉樹(shù)。有如下算法,按層次(從上到下,從左到右)遍歷二叉樹(shù),當(dāng)遇到一個(gè)節(jié)點(diǎn)的左子樹(shù)為空時(shí),則該節(jié)點(diǎn)右子樹(shù)必須為空,且后面遍歷的節(jié)點(diǎn)左右子樹(shù)都必須為空,否則
89、不是完全二叉樹(shù)。1. bool IsCompleteBinaryTree(BinaryTreeNode * pRoot) 2. 3. if(pRoot = NULL) 4. return false; 5. queue<BinaryTreeNode
90、160;*> q; 6. q.push(pRoot); 7. bool mustHaveNoChild = false; 8. bool result = true; 9. while(!q.empty() 10. 11. BinaryTreeNode * pNode = q.front(); 12. q.pop(); 13. if(mustHave
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 地下排污管道施工方案
- 頂管豎井施工方案
- 陽(yáng)極爐溜槽施工方案
- 市政施工方案
- 2025年精細(xì)化學(xué)品:日用化學(xué)品項(xiàng)目發(fā)展計(jì)劃
- 社區(qū)婦聯(lián)工作總結(jié)
- 2025年多翼式鼓風(fēng)機(jī)項(xiàng)目建議書
- 企業(yè)市場(chǎng)運(yùn)營(yíng)部工作總結(jié)
- 課題開(kāi)題報(bào)告:湖北縣域義務(wù)教育發(fā)展督導(dǎo)評(píng)估方法與路徑研究
- 課題開(kāi)題報(bào)告:基礎(chǔ)教育全學(xué)段貫通培養(yǎng)模式研究
- 物資裝卸培訓(xùn)課件
- DB5101-T 71-2020 成都市電動(dòng)汽車充電設(shè)施 安全管理規(guī)范
- 2025年七臺(tái)河職業(yè)學(xué)院高職單招語(yǔ)文2018-2024歷年參考題庫(kù)頻考點(diǎn)含答案解析
- 監(jiān)理人員安全培訓(xùn)考試試卷(答案)
- 2025年北京電子科技職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年??及鎱⒖碱}庫(kù)含答案解析
- xxx項(xiàng)目財(cái)務(wù)評(píng)價(jià)報(bào)告
- 2024年山東交通職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 團(tuán)隊(duì)賦能培訓(xùn)
- 2025年廣東廣州市黃埔區(qū)第二次招聘社區(qū)專職工作人員高頻重點(diǎn)提升(共500題)附帶答案詳解
- 第一單元第2課《人工智能應(yīng)用》說(shuō)課稿 2023-2024學(xué)年浙教版(2023)初中信息技術(shù)八年級(jí)下冊(cè)
- 2025年寫人要抓住特點(diǎn)
評(píng)論
0/150
提交評(píng)論