zoukankan      html  css  js  c++  java
  • 剑指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)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    c语言 12
    c语言中用结构体表示点的坐标,并计算两点之间的距离
    c语言 12
    c语言中结构体数组
    c语言 12-3
    c语言 12-2
    codevs3164 质因数分解
    codevs4438 YJQ Runs Upstairs
    codevs4439 YJQ Requires Food
    codevs4437 YJQ Arranges Sequences
  • 原文地址:https://www.cnblogs.com/libin123/p/13280761.html
Copyright © 2011-2022 走看看