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

猜你喜欢

转载自blog.csdn.net/zhaitianbao/article/details/122255122
今日推荐