剑指offer32 从上到下打印二叉树(叁)

如下是本人自己的题解。

/**
 * 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

原文地址:https://www.cnblogs.com/libin123/p/13280761.html