猫眼娱乐IOS开发一面手撕算法

力扣:103.二叉树的锯齿状层序遍历

主要就是bool变量判断状态是从左往右还是从右往左,如果是从右向左就使用reverse反转一下。

bool变量确保第一层根节点是正序(本质也是从左向右了),第二层是从左向右,第三层是从右向左(使用reverse反转),后面以此类推。

这里不做解释了,因为面过的手撕题下次不想再做错了,这里做下笔记,时刻提醒自己曾经栽在这个题目上。

面试官给出的题目太含糊了,没太清楚他是要将树本身的层序进行反转,还是只将遍历的结果输出锯齿状,当时脑子已经宕机了,也是最近熬夜没睡好的原因。

cpp 复制代码
vector<vector<int>> func(TreeNode* root){
    vector<vector<int>> vec2;
    queue<TreeNode*> q;
    q.push(root);
    if(!root) return vec2;
    bool flag=true;//判断从左向右还是从右向左
    while(!q.empty()){
        int n=q.size();//一定要声明出来,因为每一次的队列的大小都会发生变化,即:树的每一层元素个数不同
        vector<int> vec1;
        for(int i=0;i<n;i++){
            auto node=q.front(); q.pop();
            vec1.push_back(node->val);
            if(node->left) q.push(node->left);
            if(node->right) q.push(node->right);
        }
        if(flag==false) reverse(vec1.begin(),vec1.end()); //如果不是偶数层就忽略这行,是就执行
        vec2.push_back(vec1);
        flag=!flag;//奇数层之后就是偶数层,从true变false
    }
    return vec2;
}