把二叉树打印成多行

题目:把二叉树打印成多行

题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

思路

用队列进行层次遍历即可

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值