二叉树是一棵有层序的树,现在要求是把这棵树打印为每一层结点的值在一行
即如图形式:
使用数组形式的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; } };