前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer 按之字形顺序打印二叉树

剑指offer 按之字形顺序打印二叉树

作者头像
week
发布2019-04-01 14:48:49
4090
发布2019-04-01 14:48:49
举报
文章被收录于专栏:用户画像

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

方法一

方法和从上往下打印二叉树类似,遍历顺序是从上到下,每一行按照从左到右的顺序进行遍历,但是需要增加一个参数row来标记当前行数,如果是偶数行,则每次将值放入vector的末尾;如果是奇数行,则每次将值插入vector的第一个位置。

代码语言:javascript
复制
/*
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;
    }
     
};

方法二

根据题意,每行的节点的访问顺序是相反的,我们可以用两个栈来隔行存储,一个栈中根据“左结点->右结点”的顺序访问另一个栈的栈顶元素,而另一个栈根据“右子树->左子树”的顺序访问另一个栈的栈顶元素,直到两个栈都为空

以如下二叉树为例:

代码语言:javascript
复制
                 8
                / \
               6   10
              / \  / \
             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均为空,说明树中所有节点已经遍历完成。

代码语言:javascript
复制
/*
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;
    }
    
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年03月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 方法一
  • 方法二
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档