Untitled


SUBMITTED BY: Guest

DATE: June 2, 2017, 1:49 p.m.

FORMAT: C++

SIZE: 3.8 kB

HITS: 484

  1. #include<iostream>
  2. using namespace std;
  3. typedef char MyData;
  4. struct TreeNode
  5. {
  6. MyData Key;
  7. TreeNode *Next; // Con tro dong vai tro lien ket 1 danh sach lien ket don
  8. TreeNode *Left; // -------------------- lien ket tren cay ---------------
  9. TreeNode *Right;// ------------------------------------------------------
  10. }; // Node vua la Node trong LinkList vua la Node cua Tree.
  11. TreeNode* MakeTNode(MyData Data) // Tao mot node moi
  12. {
  13. TreeNode *p = new TreeNode;
  14. p->Key = Data;
  15. p->Left = NULL;
  16. p->Right = NULL;
  17. p->Next = NULL;
  18. return p;
  19. }
  20. void PushToStack(TreeNode *&pHead, TreeNode *pNode) // Day mot nut vao Stack (AddHead)
  21. {
  22. if (pHead == NULL)
  23. {
  24. pHead = pNode;
  25. }
  26. else
  27. {
  28. pNode->Next = pHead;
  29. pHead = pNode;
  30. }
  31. }
  32. MyData PopDataFromStack(TreeNode *&pHead) // Lay du lieu ra tu dinh cua Stack
  33. {
  34. if (pHead != NULL)
  35. {
  36. char tmp = pHead->Key;
  37. TreeNode *p = pHead;
  38. pHead = pHead->Next;
  39. delete p;
  40. return tmp;
  41. }
  42. }
  43. TreeNode* PopNodeFromStack(TreeNode *&pHead) // Lay mot node ra tu dinh cua Stack
  44. {
  45. if (pHead != NULL)
  46. {
  47. TreeNode *p = pHead;
  48. pHead = pHead->Next;
  49. p->Next = NULL;
  50. return p;
  51. }
  52. }
  53. TreeNode *CreateTreeNode(TreeNode *& Operator, TreeNode *& Node)
  54. {
  55. MyData tmp;
  56. tmp = PopDataFromStack(Operator);
  57. TreeNode *p = MakeTNode(tmp);
  58. TreeNode *ptmp;
  59. ptmp = PopNodeFromStack(Node);
  60. p->Right = ptmp;
  61. ptmp = PopNodeFromStack(Node);
  62. p->Left = ptmp;
  63. return p;
  64. } // Tao mot cay moi bang cach lay tu Operator Stack 1 phan tu va Node Stack 2 phan tu
  65. void PreOrderTrav(TreeNode* root) // Duyet NLR
  66. {
  67. if (root != NULL)
  68. {
  69. cout << root->Key;
  70. PreOrderTrav(root->Left);
  71. PreOrderTrav(root->Right);
  72. }
  73. }
  74. void PostOrderTrav(TreeNode *root) //Duyet LRN
  75. {
  76. if (root != NULL)
  77. {
  78. PostOrderTrav(root->Left);
  79. PostOrderTrav(root->Right);
  80. cout << root->Key;
  81. }
  82. }
  83. void TraverseInStack(TreeNode *Head)
  84. {
  85. while (Head)
  86. {
  87. cout << Head->Key;
  88. Head = Head->Next;
  89. }
  90. }
  91. int main()
  92. {
  93. TreeNode *OperatorStack = NULL , *NodeStack = NULL;
  94. // Khoi tao 2 stack
  95. char x;
  96. char tmp;
  97. do
  98. {
  99. cin >> x;
  100. if (x == '#')
  101. break;
  102. if (x == '*' || x == '/' || x == '+' || x == '-' || x == '(' || x == ')') // Neu la toan tu
  103. {
  104. if (OperatorStack == NULL || x == '(')
  105. PushToStack(OperatorStack, MakeTNode(x));
  106. else
  107. if (x == '+' || x == '-')
  108. {
  109. while (OperatorStack != NULL && OperatorStack->Key != '(')
  110. PushToStack(NodeStack, CreateTreeNode(OperatorStack, NodeStack));
  111. PushToStack(OperatorStack, MakeTNode(x));
  112. }
  113. else
  114. if ((x=='*'|| x=='/') && (OperatorStack->Key =='*' || OperatorStack->Key == '/'))
  115. {
  116. while (OperatorStack != NULL && (OperatorStack->Key == '*' || OperatorStack->Key == '/'))
  117. PushToStack(NodeStack, CreateTreeNode(OperatorStack, NodeStack));
  118. PushToStack(OperatorStack, MakeTNode(x));
  119. }
  120. else
  121. if (x == ')')
  122. {
  123. while (OperatorStack->Key != '(')
  124. PushToStack(NodeStack, CreateTreeNode(OperatorStack, NodeStack));
  125. tmp = PopDataFromStack(OperatorStack);
  126. }
  127. else
  128. PushToStack(OperatorStack, MakeTNode(x));
  129. }
  130. else // Neu la toan hang
  131. PushToStack(NodeStack, MakeTNode(x));
  132. // Bo comment neu muon kiem tra stack hoat dong
  133. //////cout << "operstack: ";
  134. //////TraverseInStack(OperatorStack);
  135. //////cout << endl;
  136. //////cout << "nodestack: ";
  137. //////TraverseInStack(NodeStack);
  138. //////cout << endl;
  139. } while (x != '#');
  140. while (OperatorStack != NULL)
  141. PushToStack(NodeStack, CreateTreeNode(OperatorStack, NodeStack));
  142. PreOrderTrav(NodeStack);
  143. cout << endl;
  144. PostOrderTrav(NodeStack);
  145. return 0;
  146. }

comments powered by Disqus