如下是本人自己的题解。
/** * 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>> levelOrder(TreeNode* root) { vector<vector<int>> res1; if(root==NULL) { return res1;//返回一个空的 } vector<vector<int>> res(1000);//开始不知道多大,但最多1000个 queue<TreeNode*> q;//存奇数行节点 queue<TreeNode*> q1;//存偶数行节点 vector<int> temp1;//存奇数行的数 vector<int> temp2;//存偶数行的数 int num=0;//记录层数 q.push(root); while(!q.empty() || !q1.empty()) { while(!q.empty())//奇数行进来了 { TreeNode* temp=q.front(); temp1.push_back(temp->val);//把奇数行现在遍历到的存下来 q.pop(); if(temp->left!=NULL)//把其孩子放到偶数行的队列中 { q1.push(temp->left); } if(temp->right!=NULL) { q1.push(temp->right); } } if(temp1.size()!=0)//所有奇数行遍历完了 { reverse(temp1.begin(),temp1.end());//为了能用pop_back,专门翻转一下 int l=temp1.size(); for(int i=l-1;i>=0;i--) { res[num].push_back(temp1[i]); temp1.pop_back(); } num++;//下一层了 } while(!q1.empty()) { TreeNode* temp=q1.front(); temp2.push_back(temp->val); q1.pop(); if(temp->left!=NULL) { q.push(temp->left); } if(temp->right!=NULL) { q.push(temp->right); } } if(temp2.size()!=0)//因为本来偶数行就是要反着来,并不用翻转 { int l=temp2.size(); for(int i=l-1;i>=0;i--) { res[num].push_back(temp2[i]); temp2.pop_back(); } num++; } } int count=0;//因为vector如果没有定义多大时不能直接用下标来赋值的 for(int i=0;i<res.size();i++) { if(res[i].size()!=0) { count++;//上边定义了最大1000,现在数数到底有多少 } } vector<vector<int>> res2(count); for(int i=0;i<count;i++) { int l=res[i].size(); for(int j=0;j<l;j++) { res2[i].push_back(res[i][j]);//复制出来 } } return res2; } }; 作者:jackkkooo 链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/solution/liang-ge-dui-lie-mo-ni-you-dian-ma-fan-by-jackkkoo/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。