103.Binary Tree Zigzag Level Order Traversal

103.Binary Tree Zigzag Level Order Traversal

Difficulty:medium

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] ]

解题思路

此题是一道关于树这样一个数据结构的展示问题。理解清楚题目中的数据结构的构成,这道题应该是不难解决的。不过要较为注意的几点是,数据的储存方式在单双数行间顺序是不同的。于是要加入基础的判定来区别单双数行的储存。

过程中遇到较为麻烦的事情是因为对于树这个结构很久没有使用(大二上学期之后就没用过了lol),一度不知道该如何存储每一行的信息。不过在复习之后就基本有了思路。

具体思路是扫描搜索上一层的节点的分支之后统计一下具体数目(我用了size保存),在生成下一层的vector时记得判断清楚何时该层结束(利用size)。

另外一个问题在于如何反转vector,不过这个有现成的函数就可以直接使用就好,也即是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) {
        queue<TreeNode*> temp;
        vector<vector<int>> ans;
        vector<int> temp_ans;
        TreeNode* node;
        if(root == NULL)
        return ans;
        temp.push(root);

        bool judge = false;

        while(!temp.empty())
        {
            int size = temp.size();
            temp_ans.clear();
            for(int i = 0;i < size;i++)
            {
                node = temp.front();  
                temp.pop();  
                temp_ans.push_back(node->val);  
                if (node->left != NULL)  
                    temp.push(node->left);  
                if (node->right != NULL)  
                    temp.push(node->right);
            }
            if(judge)
            {
                reverse(temp_ans.begin(),temp_ans.end());
            }
            judge = 1 - judge;
            ans.push_back(temp_ans);
        }
        return ans;
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值