1. 程式人生 > 實用技巧 >劍指offer(59):按之字形順序列印二叉樹

劍指offer(59):按之字形順序列印二叉樹

題目描述

請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

思路:使用一個雙端佇列,當奇數層的時候從隊頭出佇列訪問,從隊尾入佇列,先左孩子入佇列後右孩子入佇列;當偶數層的時候,從隊尾出佇列訪問結點,從隊頭入佇列,先右孩子入佇列,後左孩子入佇列

C++實現:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/ class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> > result; if(pRoot){ //定義變數 deque<TreeNode*> dequeRoot; //設定一個雙端佇列用來儲存結點 vector<int> order; //設定一個vector用來儲存當前層的順序資訊
TreeNode* q; //臨時結點 int dSize = 0;//儲存當前佇列的個數,即當前層結點的個數 int level = 0;//當前是第一層,根據奇數層,偶數層有不同的遍歷方法 dequeRoot.push_back(pRoot); //根節點入佇列 while(!dequeRoot.empty()){ dSize = dequeRoot.size(); //當前佇列長度即當前層的結點個數
level++; //層數++ for(int i=0;i<dSize;i++){ if(level%2==1){ //奇數層,結點從佇列頭出佇列,從佇列尾入佇列,先左孩子後右孩子 q = dequeRoot.front(); dequeRoot.pop_front(); if(q->left) dequeRoot.push_back(q->left); if(q->right) dequeRoot.push_back(q->right); }else{ //偶數層,結點從隊尾出佇列,從隊頭入佇列,先右孩子後左孩子 q = dequeRoot.back(); dequeRoot.pop_back(); if(q->right) dequeRoot.push_front(q->right); if(q->left) dequeRoot.push_front(q->left); } order.push_back(q->val); //當前結點值儲存到vector中 } //儲存該層的遍歷順序,並清空order,為下一層的遍歷做準備 result.push_back(order); order.clear(); } } return result; } };

看評論區的思路:使用兩個棧或者使用一個佇列和一個棧