二叉树的遍历(非递归方法)

1.preorderTraversal

由于先序遍历无需存储根节点的指针,可以很简单的设置这一个栈,当栈不空时弹出一个节点,访问,然后分别将左右子树压栈即可。

下面是第二种方法,模拟了递归的过程;

代码:

void preorder(TreeNode * root){
     auto p = root;
     stack<TreeNode *> s;
     while(p || !s.empty()){
         while(p){
             visit(p);
             s.push(p);
             p = p->left;
         }
         if(!s.empty()){
             p = s.top();
             s.pop();
             p = p->right;
          }
      }
 }

inorder:

 中根遍历根先根遍历差不多,只不过把visit的操作移到了从栈中取节点的地方。

代码:

void inorder(TreeNode * root){
     auto p = root; 
     stack<TreeNode *> s;
     while(p || !s.empty()){
         while(p){
             s.push(p);
             p = p->left;
         }
         if(!s.empty()){
             p = s.top();
             s.pop();
             visit(p);
             p = p->right;
         }
      }
 }

postorder:

后根遍历在回溯之后并不立即弹出栈,而是访问右子树,所有需要记录该节点的右子树是否被访问

代码:

void postorder(TreeNode* root)  
{  
    stack<pair<TreeNode *,bool>> s;  
    auto p = root;  
      
    do{  
       while(p){  
          s.push(make_pair(p,false));  
          p = p->left;  
       }  
          
       while(!s.empty() && s.top().second == true)  {  
          visit(s.top().first);  
          s.pop();  
}
if(!s.empty()) { s.top().second = true; p = s.top().first->right; } }while(!s.empty()); }

 

posted on 2014-11-25 09:36  远近闻名的学渣  阅读(245)  评论(0)    收藏  举报

导航