刷题之二叉树之字形变换

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

例如:
给定的二叉树是{3,9,20,#,#,15,7},

该二叉树之字形层序遍历的结果是
[
[3],
[20,9],
[15,7]
]

解题思路:二叉树的层序遍历要用队列,二叉树的前中后序遍历要用堆栈,当然也可以用递归。

回归本题,因为是要求一层从左到右一层从右到左,所以和标准的层序遍历还要多一层之字变化的要求。

这里如果在二叉树结点一层一层放到vector<int> ans 里是不好区分左右的话,可以在vector<vector<int>>res反转某一层(即ans)的顺序。

c++代码如下:

/**
 * struct TreeNode {
 *    int val;
 *    struct TreeNode *left;
 *    struct TreeNode *right;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 
     * @return int整型vector<vector<>>
     */
    vector<vector<int> > zigzagLevelOrder(TreeNode* root) {
        vector<vector<int> > res;
        queue <TreeNode *> que;
        if(root==nullptr)
            return res;
        que.push(root);
        while(!que.empty())
        {
            vector<int> ans;
            int size=que.size();
            for(int i=0;i<size;i++)
            {
                TreeNode *node=que.front();
                que.pop();
                ans.push_back(node->val);
                if(node->left)
                    que.push(node->left);
                if(node->right)
                    que.push(node->right);
            }
            res.push_back(ans);
        }
        for (int i = 0; i < res.size(); i++)
            if (i & 1 != 0)
                reverse(res[i].begin(), res[i].end());
        return res;
    }
};

 

posted @ 2021-03-12 17:58  justloving  阅读(105)  评论(0编辑  收藏  举报