二叉树的遍历(前中后序,递归和非递归)

Posted hekuiflye

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的遍历(前中后序,递归和非递归)相关的知识,希望对你有一定的参考价值。

一、二叉树的前序遍历:

//递归前序遍历 
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("
");
    }
} 

四、二叉树的层次遍历:

//层次遍历 
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);
        }
    }
}

 

以上是关于二叉树的遍历(前中后序,递归和非递归)的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的前中后和层序遍历详细图解(递归和非递归写法)

二叉树前中后序遍历的实现(递归和非递归版)

二叉树链式存储的前中后递归和非递归遍历层序遍历实现

二叉树链式存储的前中后递归和非递归遍历层序遍历实现

二叉树的前中后序遍历简单的递归

必须掌握,二叉树的前中后序遍历(迭代+递归)详细代码与思路