二叉树的非递归遍历

来源:互联网 发布:顶点网络微博平台代理 编辑:程序博客网 时间:2024/06/13 11:25

原文地址: http://blog.163.com/zhaohai_1988/blog/static/2095100852012824102839566/


 以前写过一个二叉树的后续遍历的迭代版本,其实实现的方法有很多种,今天对二叉树的所有遍历方法都做一个补全。递归版本的太简单了,就不写了,只记录下迭代版本的遍历方法。

  1. //非递归先序遍历树  
  2. void preOrder(Node* root)  
  3. {  
  4.     stack<Node*> s;  
  5.     Node* p=NULL;  
  6.     if(root==NULL) return;  
  7.     s.push(root);  
  8.     while(!s.empty())  
  9.     {  
  10.         p=s.top(); s.pop();  
  11.         cout<<p->data<<" ";  
  12.         if(p->right) s.push(p->right);  
  13.         if(p->left) s.push(p->left);  
  14.     }  
  15. }  
  16.   
  17. //非递归先序遍历树  
  18. void preOrder(Node* t)  
  19. {  
  20.     stack<Node*> s;  
  21.     Node* p=t;  
  22.     while (p!=NULL || !s.empty())  
  23.     {  
  24.         while (p!=NULL)  //遍历左子树  
  25.         {  
  26.             cout<<p->data<<" ";  
  27.             s.push(p);  
  28.             p=p->left;  
  29.         }  
  30.         if (!s.empty()) //通过下一次循环中的内嵌while实现右子树遍历  
  31.         {  
  32.             p=s.top();  
  33.             s.pop();  
  34.             p=p->right;  
  35.         }  
  36.      }  
  37. }  
  38.   
  39. /*非递归中序遍历树算法:从根节点开始,只要当前节点存在,或者栈不为空,则重复下面操作: 
  40.   (1)如果当前节点存在,则进栈并走左子树。 
  41.   (2)否则退栈并访问,然后走右子树。 
  42. */  
  43. void inOrder(Node* t)  
  44. {  
  45.     stack<Node*> s;  
  46.     Node* p=t;  
  47.     while(p||!s.empty())  
  48.     {  
  49.         if(p)  
  50.         {  
  51.             s.push(p);  
  52.             p=p->left;  
  53.         }  
  54.         else  
  55.         {  
  56.             p=s.top();s.pop();  
  57.             cout<<p->data<<" ";  
  58.             p=p->right;  
  59.         }  
  60.     }  
  61. }  
  62.   
  63. /*非递归后序遍历树:后序遍历,先遍历到的结点最后访问 
  64. 用两个栈,一个栈用来遍历,另一个栈保存遍历到的结点,最后一起出栈,就是后序遍历结果 
  65. */  
  66. void postOrder(Node* root)  
  67. {  
  68.     stack<Node*> sTraverse,sVisit;  
  69.     Node* p=NULL;  
  70.     if(root==NULL) return;  
  71.     sTraverse.push(root);  
  72.     while(!sTraverse.empty())  
  73.     {  
  74.         p=sTraverse.top(); sTraverse.pop();  
  75.         sVisit.push(p);  
  76.         if(p->left) sTraverse.push(p->left);  
  77.         if(p->right) sTraverse.push(p->right);  
  78.     }  
  79.     while(!sVisit.empty())  
  80.     {  
  81.         p=sVisit.top(); sVisit.pop();  
  82.         cout<<p->data<<" ";  
  83.     }  
  84. }  
  85.   
  86. /*非递归后序遍历树算法:从根节点开始,只要当前节点存在,或者栈不为空,则重复下面操作: 
  87.   (1)从当前节点开始,进栈并走左子树,直到左子树为空。 
  88.   (2)如果栈顶节点的右子树为空,或者栈顶节点的右孩子为刚访问过的节点, 
  89.      则退栈并访问,然后置当前节点指针为空。 
  90.   (3)否则走右子树。 
  91. */  
  92. void postOrder(Node* t)  
  93. {  
  94.     Node *p,*q;  
  95.     stack<Node*> s;  
  96.     p=t;  
  97.     q=NULL;  
  98.     while(p!=NULL||!s.empty())  
  99.     {  
  100.         while(p!=NULL)  
  101.         {  
  102.             s.push(p); p=p->left;  
  103.         }  
  104.         if(!s.empty())  
  105.         {  
  106.             p=s.top();  
  107.             if((p->right==NULL) || (p->right==q))  
  108.             {  
  109.                 cout<<p->data<<" ";  
  110.                 q=p;  
  111.                 s.pop();  
  112.                 p=NULL;  
  113.             }  
  114.             else p=p->right;  
  115.         }  
  116.     }  
  117. }  
  118.   
  119. /*根节点到r节点的路径: 
  120. 后序遍历时访问到r节点时,栈中的所有的节点均为r节点的祖先,这些祖先构成根节点到r节点的路径 
  121. */  
  122. void nodePath(Node* root,Node* r)  
  123. {  
  124.     Node *p,*q;  
  125.     stack<Node*> s;  
  126.     p=root;  
  127.     q=NULL;   //q保存刚访问过的节点  
  128.     while(p!=NULL||!s.empty())  
  129.     {  
  130.         while(p!=NULL)  
  131.         {  
  132.             s.push(p); p=p->left;  
  133.         }  
  134.         if(!s.empty())  
  135.         {  
  136.             p=s.top();  
  137.             if( (p->right==NULL) || (p->right==q) )  
  138.             {  
  139.                 if(p==r)  
  140.                 {  
  141.                     while(!s.empty())  
  142.                     {  
  143.                         Node* t=s.top();  
  144.                         s.pop();  
  145.                         cout<<t->value<<" ";  
  146.                     }  
  147.                     return;  
  148.                 }  
  149.                 else  
  150.                 {  
  151.                     q=p;  
  152.                     s.pop();  
  153.                     p=NULL;  
  154.                 }  
  155.             }  
  156.             else p=p->right;  
  157.         }  
  158.     }  
  159. }  

0 0
原创粉丝点击