题目:把二叉树打印成多行
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路
用队列进行层次遍历即可
class Solution {
public:
vector<vector<int> > Print(TreeNode* pRoot) {
vector<vector<int> > res;
if(pRoot==NULL) return res;
queue<TreeNode *> q;
vector<int> row;
q.push(pRoot);
while(!q.empty()){
int size = q.size();
for(int i=0;i<size;i++){
TreeNode *now = q.front();
row.push_back(now->val);
if(now->left) q.push(now->left);
if(now->right) q.push(now->right);
q.pop();
}
res.push_back(row);
row.clear();
}
return res;
}
};
完整测试代码
#include<bits/stdc++.h>
using namespace std;
struct TreeNode{
int val;
TreeNode *left;
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==NULL) return res;
queue<TreeNode *> q;
vector<int> row;
q.push(pRoot);
while(!q.empty()){
int size = q.size();
for(int i=0;i<size;i++){
TreeNode *now = q.front();
row.push_back(now->val);
if(now->left) q.push(now->left);
if(now->right) q.push(now->right);
q.pop();
}
res.push_back(row);
row.clear();
}
return res;
}
// 思路:递归左右子树,找出左右的pre和vin
TreeNode *reConstructBinaryTree(vector<int> pre, vector<int> vin){
int mid, size=pre.size();
if(size==0) return NULL;
TreeNode *root = new TreeNode(pre[0]);
// 找mid的位置
for(int i=0;i<size;i++){
if(pre[0]==vin[i]){
mid=i;break;
}
}
// 定义l_pre,l_vin,r_pre,r_vin;
vector<int> l_pre,l_vin,r_pre,r_vin;
for(int i=0;i<mid;i++){
l_pre.push_back(pre[i+1]);
l_vin.push_back(vin[i]);
}
for(int i=mid+1;i<size;i++){
r_pre.push_back(pre[i]);
r_vin.push_back(vin[i]);
}
//递归找出左右子树
root->left = reConstructBinaryTree(l_pre, l_vin);
root->right = reConstructBinaryTree(r_pre, r_vin);
return root;
}
};
int main(){
// vector<int>p={1,2,4,7,3,5,6,8}, v={4,7,2,1,5,3,8,6};//不对称
vector<int>p={8,6,5,7,10,9,11}, v={5,6,7,8,9,10,11};//对称
Solution s;
//建树
TreeNode *r = s.reConstructBinaryTree(p,v);
vector<vector<int> > vv = s.Print(r);
for(int i=0;i<vv.size();i++){
for(int j=0;j<vv[i].size();j++){
cout<<vv[i][j]<<" ";
}
cout<<endl;
}
return 0;
}