题意:
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替).
方法一:
bfs层次遍历
思路:利用队列实现 bfs 层次遍历。重点:计算每一层时,要先记录当前队列的元素个数。(可以实现每层的遍历)之后,将非空的左儿子节点入队,将非空的右儿子节点入队。最后,将偶数层的 vector 反转。
class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> res; vector<int> v; if(pRoot==nullptr) return res; queue<TreeNode*> q;//队列 q.push(pRoot);//根节点入队 int id=0; while(!q.empty()){ int num=q.size();//记录当前队列的元素个数 v.clear(); id++; while(num--){ auto t=q.front();//出队 q.pop(); v.push_back(t->val); if(t->left){//将非空的左儿子节点入队 q.push(t->left); } if(t->right){//将非空的右儿子节点入队 q.push(t->right); } } if(id%2==0){//将偶数层反转 reverse(v.begin(),v.end()); } res.push_back(v); } return res; } };
时间复杂度:空间复杂度:
方法二:
dfs 递归
思路:重点:记录每个节点的深度,而每一个的深度对应一个 vector。
因此,可以递归遍历每个节点,记录每个节点的深度。
最后,将偶数层的vector反转。
class Solution { public: vector<vector<int>> res; vector<vector<int> > Print(TreeNode* pRoot) { dfs(pRoot,1); for(int i=1;i<res.size();i+=2){//将偶数层的vector反转 reverse(res[i].begin(),res[i].end()); } return res; } void dfs(TreeNode* root,int depth){ if(root==nullptr){ return; } if(res.size()<depth){//新建一层 res.push_back(vector<int>()); } res[depth-1].push_back(root->val); dfs(root->left,depth+1);//递归左儿子节点 dfs(root->right,depth+1);//递归右儿子节点 } };
时间复杂度:空间复杂度: