二叉树是一棵有层序的树,现在要求是把这棵树打印为每一层结点的值在一行
即如图形式:
使用数组形式的vector来存储每一行的元素,然后再将存有元素的vector存储到另一个vector里,这样打印出来的就是分别每一行元素
/*
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> > v;
queue<TreeNode*> q;
if(pRoot==NULL)
return v;
q.push(pRoot);
while(!q.empty())
{
vector<int> vec;
int i = 0,size = q.size();
while(i++<size)
{
TreeNode* cur = q.front();
q.pop();
vec.push_back(cur->val);
if(cur->left)
q.push(cur->left);
if(cur->right)
q.push(cur->right);
}
v.push_back(vec);
}
return v;
}
};
序列化二叉树以及反序列化
#include<string>
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
char* Serialize(TreeNode *root) {
if (root == NULL)
return NULL;
string s;//使用字符串来存储序列化之后的
Serialize(root, s);//序列化二叉树之后,将数值存到字符串里
char* tmp = new char[s.length() + 1];//申请空间,以便拷贝
int i;
for (i = 0; i<s.length(); i++)
{
tmp[i] = s[i];
}
tmp[i] = '\0';
return tmp;
}
//序列化二叉树
void Serialize(TreeNode *root, string& str){
if (root == NULL){
str += '$';//如果子树为空则添加符号$作为标记
return;
}
string r = to_string(root->val);//将二叉树的值转为字符串
str += r;
str += ',';
//再分别去递归左右子树的
Serialize(root->left, str);
Serialize(root->right, str);
}
//反序列化二叉树 参数为字符串
TreeNode* Deserialize(char *str) {
if (str == NULL)
return NULL;
TreeNode* node = Deserial(&str);
return node;
}
TreeNode* Deserial(char** str)
{
if (**str == '$')
{
++(*str);
return NULL;//判断是否为特殊字符,如果是的话就返回空
}
//将读到的字符串的转化为整数
int num = 0;
while (**str != '\0' && **str != ','){
num = num * 10 + ((**str) - '0');
++(*str);
}
//重建二叉树
TreeNode* root = new TreeNode(num);
if (**str == '\0')
return root;
else
(*str)++;
root->left = Deserial(str);
root->right = Deserial(str);
return root;
}
};