猫眼娱乐IOS开发一面手撕算法
力扣:103.二叉树的锯齿状层序遍历
主要就是bool变量判断状态是从左往右还是从右往左,如果是从右向左就使用reverse反转一下。
bool变量确保第一层根节点是正序(本质也是从左向右了),第二层是从左向右,第三层是从右向左(使用reverse反转),后面以此类推。
这里不做解释了,因为面过的手撕题下次不想再做错了,这里做下笔记,时刻提醒自己曾经栽在这个题目上。
面试官给出的题目太含糊了,没太清楚他是要将树本身的层序进行反转,还是只将遍历的结果输出锯齿状,当时脑子已经宕机了,也是最近熬夜没睡好的原因。
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;
}