剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)相关的知识,希望对你有一定的参考价值。

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=100
要求:空间复杂度:O(n),时间复杂度:O(n)

例如:
给定的二叉树是1,2,3,#,#,4,5

该二叉树之字形层序遍历的结果是

[

[1],

[3,2],

[4,5]

]

 

示例:

输入:

1,2,3,#,#,4,5

返回值:

[[1],[3,2],[4,5]]

说明:

如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。

解题思路:

本题考察数据结构树的使用。运用队列先进先出的特点解决该问题,执行到某一层时,将当前层的数值放入vector中保留,再将结点指针弹出队列,存入其下一层结点指针至队列;每层进行奇偶判断,偶数层对vector反转,将该层的vector放入vector<vector<int>>中;最终就实现了之字形的顺序打印。

测试代码:

/*
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>> v;
        if(!pRoot)
            return v;
        queue<TreeNode*> q;
        q.push(pRoot);
        int l=0;
        // 遍历所有结点
        while(!q.empty())
        
            int size=q.size();
            vector<int> a;
            // 遍历存放左右子树结点
            while(size--)
            
                TreeNode* n=q.front();
                q.pop();
                a.push_back(n->val);
                if(n->left)
                    q.push(n->left);
                if(n->right)
                    q.push(n->right);
            
            l++;
            // 如果l是偶数层,则将vector反转
            if(l%2==0)
                reverse(a.begin(), a.end());
            v.push_back(a);
        
        return v;
    
    
;

以上是关于剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

《剑指offer》:[61]按之字形顺序打印二叉树

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