zoukankan      html  css  js  c++  java
  • 二叉树的遍历(前、中、后序及层次遍历,递归和非递归实现)

    一、二叉树的前序遍历:

    //递归前序遍历 
    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);
            }
        }
    }
  • 相关阅读:
    Python开发之路-多进程、进程队列、事件驱动模型、IO模型前戏
    Python开发之路
    cookies,sessionstorage,localstorage的区别?
    Linux的nmon监控结果分析文件中网络分析NET
    长字符串写法
    go中语句为什么不用加分号;结束
    %v的使用
    设计模式--装饰器模式
    第一类值VS第二类值
    闭包
  • 原文地址:https://www.cnblogs.com/hekuiFlye/p/9565904.html
Copyright © 2011-2022 走看看