[Lc]103二叉树的锯齿层次遍历
Contents
题目
题解
二叉树结构如下:
//Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
1.迭代法
class Solution {//和#102类似,有所改变,有迭代法和递归法两种方法迭代。1 迭代(改变插入顺序)
//迭代分为直接翻转数组和改变插入顺序两种方式,翻转数组效率不高,谢哥改变插入顺序
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> res;//定义保存结果的数组
if(!root) return res;//特殊情况直接返回
queue<TreeNode*> q;//定义队列
q.push(root);//先把根节点加入队列
int levelNum = 0;//定义当前遍历的层数
while(!q.empty()){//当q不为空时,继续迭代
vector<int> thisLevel;//定义存储当前一行的数组
for(int i = q.size(); i>0; i--){//这一块和#102类似
TreeNode *cur = q.front();q.pop();//取队首的值,并出队
if(levelNum%2==0) thisLevel.push_back(cur->val);//偶数行在数组尾部加值
else thisLevel.insert(thisLevel.begin(),cur->val);//奇数行在数组头部加值
if(cur->left) q.push(cur->left);
if(cur->right) q.push(cur->right);//队列加入两个子节点
}
res.push_back(thisLevel);//该行数组加入结果中
levelNum++;//行数++
}
return res;
}
};
2. 递归法
class Solution {//和#102类似,有所改变,有迭代法和递归法两种方法迭代。2 递归法
vector<vector<int>> res;//定义私有变量存储结果
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if(!root) return res;//特殊情况直接返回
int levelNum = 0;
helper(root,levelNum);//调用递归函数
return res;//返回结果
}
void helper(TreeNode* cur, int level){
if(!cur) return;//特殊情况直接返回
if(res.size() <= level) res.push_back({});//这一步与#102一样,判断何时需要增加新的一行
if(level%2==0) res[level].push_back(cur->val);//偶数行在末尾加数
else res[level].insert(res[level].begin(),cur->val);//奇数行在数组头加数
helper(cur->left,level+1);
helper(cur->right,level+1);//递归左右子树
}
};
Author ChrisHRZ
LastMod 2020-03-17