二叉树的遍历(前、中、后序及层次遍历,递归和非递归实现)

时间:2022-03-24 19:38:17

一、二叉树的前序遍历:

//递归前序遍历 
void preorder(BTNode *root){
    if(root){
        printf("%c ",root->data);
        preorder(root->lchild);
        preorder(root->rchild);
    }
}

//非递归前序遍历 
void pre(BTNode *root){
    stack <BTNode*>s;    
    if(root)
        s.push(root);
    BTNode *p;
    while(!s.empty()){
        p=s.top();
        s.pop();
        printf("%c ",p->data);
        if(p->rchild!=NULL)
            s.push(p->rchild);
        if(p->lchild!=NULL)
            s.push(p->lchild);
    }
}

二、二叉树的中序遍历:

//递归中序遍历 
void inorder(BTNode *root){
    if(root){
        inorder(root->lchild);
        printf("%c ",root->data);
        inorder(root->rchild);
    }
}

//非递归中序遍历
void in(BTNode *root){
    stack<BTNode*> s;
    if(root){
        BTNode *p=root;
        while(!s.empty()||p){
            while(p){
                s.push(p);
                p=p->lchild;
            }
            if(!s.empty()){
                p=s.top();
                s.pop();
                printf("%c ",p->data);
                p=p->rchild;                
            }
        }
    }
}

三、二叉树的后序遍历:

//递归后序遍历
void postorder(BTNode *root){
    if(root!=NULL){
        postorder(root->lchild);
        postorder(root->rchild);
        printf("%c ",root->data);
    }
} 

//非递归后序遍历
void post(BTNode *root){
    stack<BTNode*> s;
    if(root!=NULL){
        BTNode *p=root;
        do{
            while(p!=NULL){
                s.push(p);
                p=p->lchild;
            }
            int flag=1;
            BTNode *q=NULL;
            while(!s.empty()&&flag){
                p=s.top();
                if(p->rchild==q){
                    printf("%c ",p->data);
                    s.pop();
                    q=p;
                }else{
                    p=p->rchild;
                    flag=0;                    
                }
            }
        }while(!s.empty());
        printf("\n");
    }
} 

四、二叉树的层次遍历:

//层次遍历 
void levelorder(BTNode *root){
    if(root!=NULL){
        queue<BTNode*> q;
        q.push(root);
        BTNode *p;
        while(!q.empty()){
            p=q.front();
            q.pop();
            printf("%c ",p->data);
            if(p->lchild!=NULL)
                q.push(p->lchild);
            if(p->rchild!=NULL)
                q.push(p->rchild);
        }
    }
}