數據結構-劍指offer-之字形打印二叉樹

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

    1    
 2    3  
4 5  6 7 
891011 12131415

        以該二叉樹爲例,按之字形輸出應爲:1     3,2       4,5,6,7     15,14,13,12,11,10,9,8

        打印第二層(偶數層)的時候,是從右向左打印,看起來節點是先入後出的,可以用棧結構實現,先把左子節點壓入棧,再把右子節點壓入棧;第三層(奇數層)的時候,是從左到右打印,所以在用棧結構存儲子節點的時候,應該是在輸出節點3的時候,把節點3的子節點按照先右後左的順序存到棧結構中(在3出棧的時候子節點同時入棧,所以需要兩個棧結構),輸出節點2的時候,把節點2的子節點按照先右後左的順序存到棧結構中;以此類推。

class Solution {
public:
    vector<vector<int> > Print(TreeNode* pRoot) {
        vector<vector<int>> result;
        if(pRoot == nullptr)
            return result;
        stack<TreeNode*> stackOdd;
        stackOdd.push(pRoot);
        //stackEven用來存儲偶數層
        stack<TreeNode*> stackEven;
        while(!stackOdd.empty() || !stackEven.empty()){
            if(!stackOdd.empty()){
                vector<int> temp;
                while(!stackOdd.empty()){
                    TreeNode* data = stackOdd.top();
                    stackOdd.pop();
                    temp.push_back(data->val);
                    if(data->left != nullptr){
                        stackEven.push(data->left);
                    }
                    if(data->right != nullptr){
                        stackEven.push(data->right);
                    }
                }
                result.push_back(temp);
            }
            if(!stackEven.empty()){
                vector<int> temp;
                while(!stackEven.empty()){
                    TreeNode* data = stackEven.top();
                    stackEven.pop();
                    temp.push_back(data->val);
                    if(data->right != nullptr){
                        stackOdd.push(data->right);
                    }
                    if(data->left != nullptr){
                        stackOdd.push(data->left);
                    }
                }
                result.push_back(temp);
            }
        }
        return result;
    }
};


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