Binary Tree Zigzag Level Order Traversal

406 篇文章 0 订阅
406 篇文章 0 订阅

1,题目要求

Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

[
  [3],
  [20,9],
  [15,7]
]

给定二叉树,返回其节点值的Z字形级别遍历。 (即,从左到右,然后从右到左进行下一级别并在之间交替)。

2,题目思路

对于这道题,要求将一棵二叉树按照Z字形层次输出。

所谓的Z字形输出,也是按照层次进行遍历,只不过按照从左往右、从右往左、再从左往右的顺序进行遍历。

在实现上,我们发现,我们首先要确定当前的行是从左往右输出还是从从右往左输出的。因此这里我们可以设置一个bool变量,每输出一行,就进行一次反转。
另外,我们还需要确定每一行的数据是什么。这里,我们在利用队列实现层次遍历的基础上,每次在开始对当前队列遍历前, 获得队列中的元素的个数,这个个数就一定是当前层的节点的个数。

因此,在实现上,我们通过获得节点个数申请一个对应大小的容器,然后根据bool变量的情况,按照从左往右或者从右往左的顺序加入节点到容器。当当前容器都插入数据后,当前层就便利完成了,将其加入到res中,反转bool,开始下一层的遍历。

当然,还有一种跟简单的方法:经过观察之后我们发现,奇数层都是从左往右,偶数层都是从右往左,因此,我们只需要按照常规层次遍历的方法进行遍历,然后根据当前层的奇偶情况,判断是否使用reverse函数来反转。

3,代码实现

1,利用bool变量判断当前遍历方向

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

int x = []() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    return 0;
}();

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(root == nullptr)
            return {};
        
        vector<vector<int>> res;
        queue<TreeNode*> q;
        q.push(root);
        bool isLeft2Right = true;
        while(!q.empty()){
            int size = q.size();
            vector<int> tmp (size, 0);
            for(int i = 0;i<size;i++){
                int val = q.front()->val;
                if(isLeft2Right)
                    tmp[i] = val;
                else
                    tmp[size-1-i] = val;
                
                if(q.front()->left!=nullptr)
                    q.push(q.front()->left);
                if(q.front()->right!=nullptr)
                    q.push(q.front()->right);
                q.pop();
            }
            res.push_back(tmp);
            isLeft2Right = !isLeft2Right;
        }
        return res;
    }
};

2,利用层数奇偶、利用reverse函数

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    public:
        vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
            if (!root) return {};
            vector<vector<int>> ret;
            queue<TreeNode*> q;
            q.push(root);
            int order = 1;
            while (!q.empty()) {
                int size = q.size();
                vector<int> level;
                for (int i = 0; i < size; ++i) {
                    TreeNode* curr = q.front();
                    level.push_back(curr -> val);
                    if (curr -> left) q.push(curr -> left);
                    if (curr -> right) q.push(curr -> right);
                    q.pop();
                }

                if (order % 2 == 0) {
                    reverse(level.begin(), level.end());
                }
                ret.push_back(level);
                order++;

            }
            return ret;
        }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值