劍指Offer——按之字形順序打印二叉樹

題目描述

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

方法一

方法和從上往下打印二叉樹類似,遍歷順序是從上到下,每一行按照從左到右的順序進行遍歷,但是需要增加一個參數row來標記當前行數,如果是偶數行,則每次將值放入vector的末尾;如果是奇數行,則每次將值插入vector的第一個位置。

代碼

/*
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>> res;
        if( pRoot == NULL )
            return res;
        queue<pair<TreeNode*,int>> q;
        q.push( make_pair(pRoot,0) );
        while( !q.empty() )
        {
            TreeNode* node = q.front().first;
            int row = q.front().second;
            q.pop();
            if( node == NULL )
                continue;
            if( res.size() <= row )
            {
                vector<int> temp;
                res.push_back(temp);
            }
            if( row%2 == 0 )
                res[row].push_back( node->val );
            else
                res[row].insert(res[row].begin(), node->val);
            q.push( make_pair(node->left, row+1) );
            q.push( make_pair(node->right, row+1) );
        }
        return res;
    }
     
};

方法二

根據題意,每行的節點的訪問順序是相反的,我們可以用兩個棧來隔行存儲,一個棧中根據“左結點->右結點”的順序訪問另一個棧的棧頂元素,而另一個棧根據“右子樹->左子樹”的順序訪問另一個棧的棧頂元素,直到兩個棧都爲空
以如下二叉樹爲例:
1                  8
2                /  \
3               6   10
4              / \  / \
5             5  7 9  11

1、首先,建立兩個棧s1和s2,將根節點(8)存入s1中。返回值爲vector<vector<int>> res;
2、然後,將s1中節點(即根節點8)彈出,將8存入res中,然後將其左子節點(6)和右子節點(10)存入s2中,此時s1爲空,s2中元素爲6、10;
3、將s2中的節點彈出,先彈出的節點爲10,後彈出的節點爲6。彈出10時,將10放入res,將其子節點按照先右子節點(11),後左子節點(9)的順序壓入s1;然後彈出節點6,同樣,將6放入res,並將其右子節點(7)和左子節點(5)壓入s1;此時s1中元素爲11、9、7、5;
4、再對s1進行類似操作,可以看出最後一行輸出順序爲5、7、9、11,符合題目要求。直到s1和s2均爲空,說明樹中所有節點已經遍歷完成。

代碼

/*
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>> res;
        if( pRoot == NULL )
            return res;
        stack<TreeNode*> s1;
        stack<TreeNode*> s2;
        int row = 0;
        s1.push( pRoot );
        while( !s1.empty() || !s2.empty() )
        {
            while( !s1.empty() )
            {
                TreeNode* node = s1.top();
                s1.pop();
                if( node == NULL )
                    continue;
                if( row >= res.size() )
                {
                    vector<int> temp;
                    res.push_back(temp);
                }
                res[row].push_back( node->val );
                s2.push(node->left);
                s2.push(node->right);
            }
            row++;
            while( !s2.empty() )
            {
                TreeNode* node = s2.top();
                s2.pop();
                if( node == NULL )
                    continue;
                if( row >= res.size() )
                {
                    vector<int> temp;
                    res.push_back(temp);
                }
                res[row].push_back( node->val );
                s1.push(node->right);
                s1.push(node->left);
            }
            row++;
        }
        
        return res;
    }
    
};
發佈了52 篇原創文章 · 獲贊 54 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章