1. 程式人生 > >劍指Offer——樹:把二叉樹列印成多行(二叉樹層序遍歷)

劍指Offer——樹:把二叉樹列印成多行(二叉樹層序遍歷)

對於二叉樹的最好的解決辦法就是遞迴。遍歷方法無外乎先序遍歷,中序遍歷,後序遍歷方法以及層序遍歷方法。

這裡給大家安利一個關於樹的面試題的連結,博主walkinginthewind比較全面且詳細的介紹了二叉樹相關的面試題:

對於層序遍歷,最好的方法就是用佇列記錄遍歷節點的值,按層列印。

求解過程是:

(1)先將根節點入隊,然後判斷佇列是否為空。

(2)如果不為空,則取出佇列首節點並輸出,判斷該節點是否有子節點,如果有就加入到佇列中。

通常情況下是列印佇列首節點,形成一個層序遍歷序列,但由於題目要求,要按照層來輸出,

所以對於每一層都要判斷佇列的長度。其佇列的長度就代表著每一層有多少個節點。

程式碼:

vector<vector<int> > Print(TreeNode* pRoot) {
            vector<int> row;//記錄每一行的節點
            vector<vector<int>> res;//記錄層序輸出的結果
            if(!pRoot) return res;
            queue<TreeNode*> que;//構建佇列,先插入根節點
            que.push(pRoot);
            while(!que.empty()){
                int len = que.size();//獲取每一層的節點數,也就是當前佇列的長度
                for(int i = 0; i < len; ++i){
                    TreeNode* pNode = que.front();//獲取佇列首節點,並列印(插入到row中)
                    row.push_back(pNode->val);
                    if(pNode->left)//判斷是否存在左子節點,若存在則插入到佇列
                        que.push(pNode->left);
                    if(pNode->right)//判斷是否存在右子節點,若存在則插入到佇列
                        que.push(pNode->right);
                    que.pop();//彈出佇列首節點
                }
                res.push_back(row);
                row.clear();//清空行記錄
            }
            return res;
        }

參考:《劍指offer》、牛客網

ps:只是學習記錄過程,如有侵權請指出,定會修正!若有錯誤,也歡迎指出!