牛客网剑指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;
    }
    
};

猜你喜欢

转载自blog.csdn.net/qq_36132127/article/details/80198523