小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

算法2(遞歸和非遞歸倆種方法實(shí)現(xiàn)二叉樹的前序遍歷)

 白雪~~~ 2012-03-10

題目:

遞歸和非遞歸倆種方法實(shí)現(xiàn)二叉樹的前序遍歷。

思路一:

對(duì)二叉樹的遞歸遍歷我相信大家只要學(xué)了數(shù)據(jù)結(jié)構(gòu)后應(yīng)當(dāng)都很容易就能寫出,這里主要是討論二叉樹的非遞歸寫法。按照二叉樹前序遍歷的定義,無論是訪問整棵樹還是其子樹,均應(yīng)該遵循先訪問根結(jié)點(diǎn),然后訪問根結(jié)點(diǎn)的左子樹,最后訪問根結(jié)點(diǎn)的右子樹的。在整個(gè)二叉樹前序遍歷的過程中,程序始終要做的工作分成倆個(gè)部分:(借用輔助棧來實(shí)現(xiàn))
1. 當(dāng)前正在處理的樹(子樹)
2. 保存在棧中等待處理的部分。

當(dāng)棧中元素位于棧頂即將出棧時(shí),意味著其根結(jié)點(diǎn)和左子樹已訪問完成,出棧后,進(jìn)入其右子樹進(jìn)行訪問。

代碼如下:

  1. /*-------------------------------
  2. Copyright by yuucyf. 2011.09.06
  3. --------------------------------*/
  4. #include "stdafx.h"
  5. #include <assert.h>
  6. #include <iostream>
  7. #include <stack>
  8. using namespace std;
  9. typedef struct tagBSTreeNode
  10. {
  11. int nValue;
  12. tagBSTreeNode *psLeft;
  13. tagBSTreeNode *psRight;
  14. tagBSTreeNode()
  15. {
  16. psLeft = psRight = 0;
  17. nValue = 0;
  18. }
  19. }S_BSTreeNode;
  20. void AddBSTreeNode(S_BSTreeNode *&psRoot, int nValue)
  21. {
  22. if (NULL == psRoot)
  23. {
  24. psRoot = new S_BSTreeNode;
  25. assert(psRoot);
  26. psRoot->nValue = nValue;
  27. return;
  28. }
  29. if (psRoot->nValue < nValue)
  30. AddBSTreeNode(psRoot->psRight, nValue);
  31. else
  32. AddBSTreeNode(psRoot->psLeft, nValue);
  33. }
  34. void PreOrder_Recursion(const S_BSTreeNode *psRoot)
  35. {
  36. if (NULL == psRoot)
  37. return;
  38. cout << psRoot->nValue << " ";
  39. PreOrder_Recursion(psRoot->psLeft);
  40. PreOrder_Recursion(psRoot->psRight);
  41. }
  42. void PreOrder_Not_Recursion(S_BSTreeNode *psRoot)
  43. {
  44. stack<S_BSTreeNode *> stackNode;
  45. S_BSTreeNode *psCurNode = psRoot;
  46. while ((!stackNode.empty()) || (psCurNode != NULL))
  47. {
  48. if (psCurNode != NULL)
  49. {
  50. while (psCurNode)
  51. {
  52. cout << psCurNode->nValue << " ";
  53. stackNode.push(psCurNode);
  54. psCurNode = psCurNode->psLeft;
  55. }
  56. }
  57. else
  58. {
  59. psCurNode = stackNode.top();
  60. stackNode.pop();
  61. psCurNode = psCurNode->psRight;
  62. }
  63. }
  64. }
  65. int _tmain(int argc, _TCHAR* argv[])
  66. {
  67. S_BSTreeNode *psRoot = NULL;
  68. AddBSTreeNode(psRoot, 8);
  69. AddBSTreeNode(psRoot, 6);
  70. AddBSTreeNode(psRoot, 4);
  71. AddBSTreeNode(psRoot, 5);
  72. AddBSTreeNode(psRoot, 12);
  73. AddBSTreeNode(psRoot, 10);
  74. AddBSTreeNode(psRoot, 15);
  75. AddBSTreeNode(psRoot, 13);
  76. AddBSTreeNode(psRoot, 14);
  77. cout << "遞歸遍歷的結(jié)果為:" << endl;
  78. PreOrder_Recursion(psRoot);
  79. cout << endl;
  80. cout << "非遞歸遍歷的結(jié)果為:" << endl;
  81. PreOrder_Not_Recursion(psRoot);
  82. cout << endl;
  83. //Don't forget to free memory.
  84. return 0;
  85. }

擴(kuò)展:

如果要求是非遞歸后序遍歷呢?非遞歸后序稍微有點(diǎn)復(fù)雜。按照二叉樹后序遍歷的定義,無論是訪問整棵樹還是起子樹,均應(yīng)該遵循先訪問根結(jié)點(diǎn)左子樹,然后訪問根結(jié)點(diǎn)的右子樹,最后訪問根結(jié)點(diǎn)。值得注意的是,當(dāng)一個(gè)元素位于棧頂即將處理的是,其左子樹的訪問一定完成,如果其右子樹不為空,接下來應(yīng)該進(jìn)入其右子樹訪問,但此時(shí)該棧頂元素時(shí)不能出棧的,因?yàn)樗鳛楦Y(jié)點(diǎn),其本身的值還未被訪問。只有等到其右子樹也訪問完成后,該棧頂元素才能出棧,并輸出它的值。 因此,在二叉樹后序遍歷的算法中,必須每個(gè)節(jié)點(diǎn)維護(hù)一個(gè)類型為int的整數(shù)nTag,
其每個(gè)元素(節(jié)點(diǎn))的nTag取值為0 或1,用于標(biāo)識(shí)棧中每個(gè)元素的狀態(tài)。
1. 當(dāng)一個(gè)元素剛進(jìn)棧時(shí),其對(duì)應(yīng)的nTag 值置為0;
2. 當(dāng)它位于棧頂即將被處理時(shí),其nTag 值為0.意味著應(yīng)該訪問其右子樹,于是將右子樹作為當(dāng)前處理的對(duì)象,此時(shí)該棧頂元素仍應(yīng)該保留在棧中,并將其對(duì)應(yīng)的nTag 值改為1.
3. 當(dāng)其右子樹訪問完成后,該元素又一次位于棧頂,而此時(shí)其nTag 值為1,意味著其右子樹已訪問完成,接下來,應(yīng)該直接訪問的就是它,將其出棧。

代碼如下:

  1. void PostOrder_Not_Recursion(S_BSTreeNode *psRoot)
  2. {
  3. stack<S_BSTreeNode *> stackNode;
  4. S_BSTreeNode *psCurNode = psRoot;
  5. while ((!stackNode.empty()) || (psCurNode != NULL))
  6. {
  7. if (psCurNode != NULL)
  8. {
  9. while (psCurNode /*&& psCurNode->nTag != 1*/)
  10. {
  11. stackNode.push(psCurNode);
  12. psCurNode = psCurNode->psLeft;
  13. }
  14. }
  15. psCurNode = stackNode.top();
  16. while ((!stackNode.empty()) && (psCurNode->nTag == 1))
  17. {
  18. cout << psCurNode->nValue << " ";
  19. stackNode.pop();
  20. if (stackNode.empty())
  21. psCurNode = NULL;
  22. else
  23. psCurNode = stackNode.top();
  24. }
  25. if (!stackNode.empty())
  26. {
  27. psCurNode->nTag = 1;
  28. psCurNode = psCurNode->psRight;
  29. }
  30. else
  31. psCurNode = NULL;
  32. }
  33. }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多