c++ 树的各种递归遍历以及非递归遍历

前序遍历(根左右):

void InOrderTree(Node* root){
    if(root!=NULL){
        preOrderTree(root->left);
        cout<<root->data<<" ";
        preOrderTree(root->right);
    }
}

void InOrderTree(){
    stact<Node*> s;
    Node* p=root;
    while(p!=NULL||!s.empty()){
        while(p!=NULL){
            s.push(p);
            p=p->left;
        }
        if(!s.empty()){
            p=s.top();
            cout<<p->data<<" ";
            s.pop();
            p=p->right;
        }
    }
}

后序遍历(左右根):

void PostOrderTree(Node* root){
    if(root!=NULL){
        preOrderTree(root->left);        
        preOrderTree(root->right);
        cout<<root->data<<" ";
    }
}

void PostOrderTree(){//初始每个结点的tag为0,tag=1表示此节点的右子树已经遍历。
    stack<Node*> s;
    Node* p=root;
    while(p!=NULL||!s.empty()){
        while(p!=NULL){
            p.push(p);
            p=p->left;
        }
        if(!s.empty()){
            p=s.top();
            if(p->tag){
                cout<<p->data<<" ";
                s.pop();
                p=NULL;
            }
            else{
                p->tag=1;
                p=p->right;
            }
        }
    }
}

层次遍历:

void LevelOrderTree(){
    queue<Node*> q;
    Node* p=NULL;
    q.push(root);
    while(!q.empty()){
        p=q.front();
        q.pop();
        if(p->left!=NULL)
            q.push(p->left);
        if(p->right!=NULL)
            q.push(p->right);
    }
    
}

 

中序遍历(左根右):

 

posted @ 2013-10-25 20:52  一种微笑  Views(679)  Comments(0)    收藏  举报