【劍指Offer】面試題61:按之字形順序打印二叉樹

整理自劍指Offer


一:題目描述

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


二:解題思路

以上面的例子爲例:

第一層:1 從左往右打印

第二層:2,3 從右往左打印

第三層:4,5,6,7,從左往右打印

第四層:8,9,10,11,12,13,14,15 從右往左打印


我們可以看出 第二層相當於 第一層左右子樹入棧後的出棧順序

                       第三層相當於 第二層出棧順序(3,2),右左子樹入棧後的出棧順序

所以整個流程可以利用棧來實現,不過奇偶層數的不同入棧的書序也不同,所以我們使用兩個棧。

偶數棧:先左後右入棧

奇數棧:先右後左入棧


三:代碼實現

/*
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;
        vector<int> temp;
        
        if(pRoot==NULL)
            return result;
        
        stack<TreeNode* > oddStack;
        stack<TreeNode* > evenStack;
        
        oddStack.push(pRoot);
        while(!oddStack.empty() || !evenStack.empty()){
            int topNum;
            TreeNode* pNode;
            
            //打印奇數行,從左向右(從1開始)
            while(!oddStack.empty()){
                pNode=oddStack.top();
                topNum=pNode->val;
                oddStack.pop();
                
                 temp.push_back(topNum);
               //下一層從右往左打印,左子樹先入棧,右子樹再入棧(棧後進先出)
                if(pNode->left!=NULL)
                	evenStack.push(pNode->left);
                if(pNode->right!=NULL)
                	evenStack.push(pNode->right);
            }
            //注意了!!!
            if(temp.size()!=0)
            	result.push_back(temp);
            temp.clear();
            
            //打印偶數行,從右向左
            while(!evenStack.empty()){
                pNode=evenStack.top();
                topNum=pNode->val;
                evenStack.pop();
                
                temp.push_back(topNum);
                //下一層從左往右打印。右子樹先入棧,左子樹再入棧
                if(pNode->right!=NULL)
                    oddStack.push(pNode->right);
                if(pNode->left!=NULL)
                    oddStack.push(pNode->left);
            }
             //注意了!!!
            if(temp.size()!=0)
           		 result.push_back(temp);
            temp.clear();
            
        }
        return result;
    }
    
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章