码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树非递归遍历

时间:2014-08-16 12:19:30      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   div   amp   log   size   

1.非递归先序遍历

要点:总是先访问根root,而将root的右结点压入栈中,当root没有左结点时,取出栈顶元素给root。

void preorder(node* root){
    if(root==NULL) return;
    stack<node*> s;
    while(true){
        cout<<root->data<<endl;
        if(root->right!=NULL) 
            s.push(root->right);
        if(root->left!=NULL)
            root = root->left;
        else if(s.empty())
            return;
        else{
            root = s.top();
            s.pop();
        }
    }
}

2.非递归中序遍历

要点:从根结点开始将左结点压栈,直到没有左结点为止,然后访问栈顶元素并出栈,完了之后,检查栈顶元素是否有右结点,如果有,还需将其压栈。

void inorder(node* root){
    if(root==NULL) return;
    stack<node*> s;
    s.push(root);
    while(true){
        root = s.top();
        while(root->left!=NULL)
            s.push(root = root->left);
        do{
            root = s.top();
            cout<<root->data<<endl;
            s.pop();
        }while(root->right==NULL&&!s.empty());
        if(root->right!=NULL)
            s.push(root->right);
        else
            return;
    }
}

 

3.非递归后序遍历

要点:先沿着最左路径将最左的一条路径上的结点压入栈,当栈顶元素既没有左结点也没有右结点时,访问该元素。弹出栈,然后判断刚被弹出的结点是新栈顶元素的左结点还是右结点,如果是左结点,将其右结点压入栈中;如果是右结点,可以继续访问新的栈顶元素。

void postorder(node* root){
    if(root==NULL) return;
    stack<node*> s;
    s.push(root);
    while(true){
        root = s.top();
        while(root->left!=NULL)
            s.push(root = root->left);
        if(root->right!=NULL)
            s.push(root->right);
        else{
            do{
                root = s.top();
                s.pop();
                cout<<root->data<<endl;
                if(s.empty()) return ;
            }while(root==s.top()->right||s.top()->right==NULL);
            s.push(s.top()->right);
        }
    }
}

二叉树非递归遍历,布布扣,bubuko.com

二叉树非递归遍历

标签:style   blog   color   os   div   amp   log   size   

原文地址:http://www.cnblogs.com/scofield0li/p/3916178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!