当前位置:   article > 正文

DS二叉树--后序遍历非递归算法

ds二叉树--后序遍历非递归算法

后序遍历一般算法:

1.若二叉树为空,则返回;否则:

2.后序遍历左子树(L)

3.后序遍历右子树(R)

4.访问根节点(D)        

 

后序遍历非递归实现需要使用到栈(需要把前几层的节点先放入后输出)

具体步骤为:

入栈走左子树,若栈顶右子树为空或栈顶右子树为刚输出的,出栈;否则走右子树。出栈时输出。

可理解为:

按照先左后右顺序,若一个节点没有后续节点,则出栈输出,若此时栈顶元素右节点未被走过,则继续将右节点压入栈中,否则,出栈输出,直到栈空。

下面讲得更加清楚:

(155条消息) 二叉树:后序遍历非递归算法_花间半盘棋的博客-CSDN博客_后序遍历的非递归算法

输入样例:

3
AB0C00D00
ABC00D00EF000
ABCD0000E0F00

输出:

CBDA
CDBFEA
DCBFEA

详细代码为:

(由于需要记录某节点是否已被走过,使用flag做标志位)

  1. #include<iostream>
  2. #include<queue>
  3. #include<stack>
  4. using namespace std;
  5. class BiTreeNode{
  6. public:
  7. char data;
  8. int flag=0;
  9. BiTreeNode* leftChild;
  10. BiTreeNode* rightChild;
  11. BiTreeNode():leftChild(NULL),rightChild(NULL){
  12. }
  13. ~BiTreeNode(){
  14. delete leftChild;
  15. delete rightChild;
  16. }
  17. };
  18. class BiTree{
  19. BiTreeNode *root;
  20. int pos;
  21. string sTree;
  22. BiTreeNode* CreateTree() {
  23. BiTreeNode* T;
  24. char c=sTree[pos++];
  25. if(pos<=sTree.length()){
  26. if(c != '0') {
  27. T = new BiTreeNode();
  28. //cout<<c<<endl;
  29. T->data = c;
  30. T->leftChild=CreateTree();
  31. T->rightChild=CreateTree();
  32. }
  33. else T = NULL;
  34. }
  35. return T;
  36. }
  37. public:
  38. queue<char> q;
  39. int floor;
  40. BiTree() :root(NULL) {};
  41. void Create(string vArray){
  42. pos = 0;
  43. sTree.assign(vArray); //把参数保存到内部字符串
  44. root = CreateTree(); //建树成功后root指向根结点
  45. }
  46. void PostOrder(){//后序遍历无递归
  47. stack<BiTreeNode*> s;
  48. s.push(root);
  49. BiTreeNode *t=root;
  50. root->flag=1;//用flag标记该节点是否被记录过
  51. while(!s.empty()&&t!=NULL){
  52. if(t->leftChild&&t->leftChild->flag!=1){//若该节点后续有左分支,且未被走过,压入栈中
  53. s.push(t->leftChild);
  54. t=t->leftChild;
  55. }
  56. else if(t->rightChild&&t->rightChild->flag!=1){/若该节点后续有右分支,且未被走过,压入栈中
  57. s.push(t->rightChild);
  58. t=t->rightChild;
  59. }
  60. else {//出栈输出,栈空结束
  61. cout<<s.top()->data;
  62. s.pop();
  63. if(!s.empty())
  64. t=s.top();
  65. }
  66. }
  67. }
  68. };
  69. int main(){
  70. int t;
  71. cin>>t;
  72. string s;
  73. while(t--){
  74. cin>>s;
  75. BiTree t;
  76. t.Create(s);
  77. t.PostOrder();
  78. cout<<endl;
  79. }
  80. return 0;
  81. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/232918?site
推荐阅读
相关标签
  

闽ICP备14008679号