二叉樹深度遍歷和廣度遍歷


在二叉樹排序中,還存在另外兩種排序,二叉樹深度優先遍歷和廣度優先遍歷。建議大家找紙幣和紙,建議手寫一下,哪怕是偽代碼。大約花費大家5-15分鍾,歡迎指正!!!

案例

對於上面二叉樹,如果面試官:

廣度優先排序

要求從上向下從左到右依次打印出來,也就是ABCDEFG,看到這個要求可能想到廣度優先排序(寬度優先排序或者橫向優先搜索)是從根結點開始沿着樹的寬度搜索遍歷。可以利用隊列實現這個排序:

是從根結點開始,沿着樹的寬度遍歷樹的節點,A第一個訪問,緊接着將A的兩個孩子BC進隊列,當B出隊列時,然后B的兩個孩子DE進去,C出隊列,C的兩個孩子FG進入,最后將DEFG輸出。

//廣度優先遍歷
void breadthFirstSearch(Tree root){
    queue<Node *> nodeQueue;  //使用C++的STL標准模板庫
    nodeQueue.push(root);
    Node *node;
    while(!nodeQueue.empty()){
        node = nodeQueue.front();
        nodeQueue.pop();
        printf(format, node->data);
        if(node->lchild){
            nodeQueue.push(node->lchild);  //先將左子樹入隊
        }
        if(node->rchild){
            nodeQueue.push(node->rchild);  //再將右子樹入隊
        }
    }
}

 

深度優先搜索

深度優先搜索:沿着樹的深度遍歷樹的所有節點,盡可能搜索樹的分支,當節點v的所有邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。
如果還存在未被發現的節點,則選擇其中一個作為源節點並重復以上過程,整個進程反復進行直到所有節點都被訪問為止。

所以深度優先排序的結果為:ABDECFG

A是第一個被訪問的,然后順序變為BD,然后E,接着為C,FG

先遍歷了根結點后,再左子樹,最后右子樹;我們可以借助棧,棧的順序是后進先出,可以讓右子樹壓棧,然后再對左子樹壓棧。代碼如下:

//深度優先遍歷
void depthFirstSearch(Tree root){
    stack<Node *> nodeStack;  //使用C++的STL標准模板庫
    nodeStack.push(root);
    Node *node;
    while(!nodeStack.empty()){
        node = nodeStack.top();
        printf(format, node->data);  //遍歷根結點
        nodeStack.pop();
        if(node->rchild){
            nodeStack.push(node->rchild);  //先將右子樹壓棧
        }
        if(node->lchild){
            nodeStack.push(node->lchild);  //再將左子樹壓棧
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM