zoukankan      html  css  js  c++  java
  • 二叉树遍历

    深度遍历:

    递归版:递归方法一定要记得加结束条件。三种遍历只是输出语句位置不同。

    前序:

    void PreOrderTraversal(Tree* tmp)
    {
        if(tmp == NULL) return;
        printf("%d
    ",tmp->val);
        PreOrderTraversal(tmp->pleft);
        PreOrderTraversal(tmp->pright);
    }

    中序:

    void InOrderTraversal(Tree* tmp)
    {
            
        if(tmp == NULL) return;
        InOrderTraversal(tmp->pleft);
        printf("%d
    ",tmp->val);
        InOrderTraversal(tmp->pright);
    }

    后序:

    void LastOrderTraversal(Tree* tmp)
    {
        if(tmp == NULL) return;
        LastOrderTraversal(tmp->pleft);
        LastOrderTraversal(tmp->pright);
        printf("%d
    ",tmp->val);    
    }

    非递归版:辅助栈完成,后序遍历和前序,中序有所差别,因为后序树最后输出根,找到右孩子,还要保留根,不弹出。

    前序:

    void UnRecPreTraversal(Tree* tree)
    {
        if(tree == NULL) return;
        //申请辅助栈
        Stack* mystack = s_Init();
        while(1)
        {
            while(tree)
            {   
                //打印
                printf("%d ",tree->val);
                //入栈
                s_Push(mystack,tree);
                //向左走
                tree = tree->pleft;
            }
            //弹出
            tree= s_Pop(mystack);
            //栈空结束
            if(tree == NULL ) break;
            tree = tree->pright;
        }    
        s_Destroy(&mystack);
    }

    中序:与前序遍历只改变了输出语句的位置

    void UnRecInTraversal(Tree* tree)
    {
        if(tree == NULL) return;
        Stack* mystack = s_Init(); 
        while(1)
        {
            while(tree)
            {
                s_Push(mystack,tree);
                tree = tree->pleft;
            }
            tree= s_Pop(mystack);
            if(tree == NULL) break;
            printf("%d ",tree->val);
            tree = tree->pright;
        }    
        s_Destroy(&mystack);
    }

    后序:先输出根的右孩子,再输出根,所以不能先将根弹出,当右孩子处理完毕或者右孩子为空时,再弹出打印。作为父亲节点,打印的前一个节点一定是它的右孩子

    void UnRecLastTraversal(Tree* tree)
    {
        if(tree == NULL) return;
        //辅助栈
        Stack* mystack = s_Init(); 
        Tree* bj = NULL;
        while(1)
        {
            while(tree)
            {
                //入栈向左走
                s_Push(mystack,tree);
                tree = tree->pleft;
            }
            if(mystack->pHead == NULL) break;
            //当栈顶元素没有右孩子,或者右孩子被标记(处理过),弹出此根节点
            if(mystack->pHead->val->pright == NULL || mystack->pHead->val->pright == bj)
            {    
                //弹出 打印 标记
                bj = s_Pop(mystack);
                printf("%d ",bj->val);
            }
            else //处理右孩子
            {
                tree = mystack->pHead->val->pright;    
            }
        }    
        s_Destroy(&mystack);
    }

    层序遍历:辅助队列,将节点先压入队列,每次取出先输出,然后查看是否有左右节点再压入队列

    void LevelTraversal(BinaryTree *pTree)
    {
        if(pTree == NULL)return;
    
        //申请辅助队列
        Queue *pQueue = Init();//根入队
        q_Push(pQueue,pTree);
    
        while(!q_IsEmpty(pQueue))
        {
            //弹出
            pTree = q_Pop(pQueue);
    
            //打印
            printf("%d ",pTree->nValue);
    
            //非空左右入队
            if(pTree->pLeft)  q_Push(pQueue,pTree->pLeft);
            if(pTree->pRight)  q_Push(pQueue,pTree->pRight);
        }
    }
  • 相关阅读:
    排序算法合集(冒泡,选择,插入,堆排,快排)
    codeforces 632+ E. Thief in a Shop
    nyoj-一笔画问题-欧拉图+联通判定
    hdu-1179-二分图最大匹配
    hdu-2063-二分图最大匹配
    (转)二分图的最大匹配、完美匹配和匈牙利算法
    hdu-2444-二分图判定+最大分配
    C
    E
    C
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/9026556.html
Copyright © 2011-2022 走看看