c++刷题(21/100)树的打印、矩阵覆盖和括号生成

时间:2023-03-10 04:53:59
c++刷题(21/100)树的打印、矩阵覆盖和括号生成

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

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

思路:一开始以为2维的vector可以直接访问,但是试了是不行,会报错,vector在有值之前不能直接访问,所以这道题就是用两个队列,第一个队列q1放一层,然后把这层的孩子节点都塞到第二个队列q2,之后再从第二个队列q2把节点一个一个塞回队列q1里,然后重复这个流程直到q1为空

/*
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>> ans ;
queue<TreeNode*> q1, q2;
if(pRoot==NULL){
return ans ;
}
q1.push(pRoot) ;
vector<int> layer ;
while(!q1.empty()){
layer.clear() ;
while(!q1.empty()){
TreeNode* tempRoot = q1.front() ;
if(tempRoot->left!=NULL){
q2.push(tempRoot->left) ;
}
if(tempRoot->right!=NULL){
q2.push(tempRoot->right) ;
}
layer.push_back(tempRoot->val) ;
q1.pop() ;
}
ans.push_back(layer) ;
while(!q2.empty()){
q1.push(q2.front()) ;
q2.pop() ;
}
}
//printLayer(pRoot,0,ans) ;
return ans ;
} };

题目二:矩阵覆盖

我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

思路:从最开始n=1的情况开始想,设m(n)为值取n的方法数量,可得递推式:m(n)= m(n-1)+ m(n-2) ,关键就是要固定方向,从左边开始铺和从右边开始是一样的

class Solution {
public:
int rectCover(int number) {
if(number<=) return ;
if(number==) return ;
if(number==) return ;
return rectCover(number-)+rectCover(number-) ;
}
};

题目三:括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 = 3,生成结果为:

[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
] 思路:就是递归找到合适的解就加到全局的vector中,给定n之后,string的长度不会超过2n,所以到0的时候判断一下结果是不是合法就行
class Solution {
public:
void build(int n, int s, string str, vector<string> &ans){
if(n==){
if(s==)ans.push_back(str) ;
return ;
}
if(s==){
build(n-,,str+"(",ans) ;
}else{
build(n-,s+,str+"(",ans) ;
build(n-,s-,str+")",ans) ;
}
}
vector<string> generateParenthesis(int n) {
vector<string> ans ;
build(n*,,"",ans) ;
return ans ;
}
};