在二叉樹排序中,還存在另外兩種排序,二叉樹深度優先遍歷和廣度優先遍歷。建議大家找紙幣和紙,建議手寫一下,哪怕是偽代碼。大約花費大家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); //再將左子樹壓棧 } } }