题目简述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
算法一:BFS
时间复杂度:O(N)
思路:
在遍历每层的时候记录下该点的层数,每层在队列中的顺序都是有序的。
即:如果将一个三层的满二叉树,从跟节点依次放入队列中,那么层数顺序是按1,2,2,3,3,3,3排列。
那么我们将在同一层的放在一个数组里即可。
代码:
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> > res; if(!pRoot) return res; queue<pair<TreeNode*,int> > q; q.push({pRoot,0}); int k=0; vector<int> p; while(q.size()){ auto t=q.front(); q.pop(); auto t1=t.first; int pos=t.second; if(t1->left) q.push({t1->left,pos+1}); //先左后右遍历树的节点,保证了顺序打印 if(t1->right) q.push({t1->right,pos+1}); if(k==pos){ p.push_back(t1->val); } else{ k=pos; //层树标记 res.push_back(p); //将上一层的值放入res中 p.clear();//清除上一层数组的值 p.push_back(t1->val); //将第k层的第一个点放进去 } } res.push_back(p);//最后一层放入res中 return res; } };
算法二:
时间复杂度:O(N)
思路:
从根节点开始,不断往从左往右下遍历,并在遍历的时候将下一个节点放入队列中。
这样可以保证,队列中的节点都是按照每层从左往右顺序排列。
那么我们如果从根节点可以推出第二层的大小,从第二层可以推出第三层的值,......
图解:
代码:
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { queue<TreeNode*> q; vector<vector<int> > ans; if(pRoot) q.push(pRoot);//如果是空则直接返回 while(q.size()) { int len=q.size();//每一层的数量 vector<int> res; for(int i=0;i<len;i++){//保证了每层都被清空 auto root=q.front(); q.pop(); if(root->left) q.push(root->left);//先左后右放入队列中保证了,顺序性。 if(root->right) q.push(root->right); res.push_back(root->val); } ans.push_back(res); } return ans; } };