/
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
// Encodes a tree to a single string.
string serialize(TreeNode* root) {
string res;
dfs_s(root, res);
return res;
}
void dfs_s(TreeNode* root, string &res){
if(!root) {
res += "null ";//如果当前节点为空,保存null和一个空格
return ;
}
res += to_string(root->val) + ' ';//如果当前节点不为空,保存数字和一个空格
dfs_s(root->left, res);
dfs_s(root->right, res);
}
// Decodes your encoded data to tree.
TreeNode* deserialize(string data) {
int u = 0; //用来保存当前的字符串遍历的位置
return dfs_d(data, u);
}
TreeNode* dfs_d(string data, int &u){//这里的u是传的引用,不是值传递
if (u == data.size()) return NULL; //如果已经达到了字符串的尾端,则退出。
int k = u;
while(data[k] != ' ') k++; //k记录当前数字的位数如134是个三位数的数字,56是个两位数的数字,退出的时候,k指向了字符的中间的空格,所以回到下个字符的首部需要加1.
if(data[u] == 'n') {//如果当前字符串是“null”
u = k+1;//回到下一个数字的首部,注意是u = k+1, 不是u = u+1;
return NULL;//表示这次构造的是一个null节点,并没有孩子节点,所以跳过后面的递归
}
int val = 0;
//如果数字是负的
if(data[u] == '-'){
for (int i = u+1; i < k; i++) val = val * 10 + data[i] - '0';
val = -val;
}
else{
//如果是数字是正的
for (int i = u; i < k; i++) val = val * 10 + data[i] - '0';
}
u = k + 1;//回到下个数字的首部
//递归算法总是先写退出条件,然后才递归调用。
auto root = new TreeNode(val);
root->left = dfs_d(data, u);
root->right = dfs_d(data, u);
return root;
}
};
棒
我照着你的模板改改,但是报错 Memory Limit Exceeded,应该是auto root = new TreeNode(val);这语句循环申请内存,但是我找不到错误的地方,发出来看看找一找错
我回想了下,无null的先序+中序的信息能建立二叉树,后序+中序一样。那有null的先序遍历的信息也足够建立二叉树。有null的中序遍历能建立二叉树吗?其实这其中很明显有个限制,auto root = new TreeNode(0);申请内存只能是先序,不然也就没啥左右孩子。null先序+申请内存先序限制。null中序行不行,即便你说我先用0占位,后序就按照中序更新值不行吗,但是这必须考虑,你要申请内存知道树最左端才开始解析null中序序列,这个信息从哪里来呢,null中序序列吗,我看不行,中序序列没有了树的高度等这种信息,而null中序序列建树偏偏需要没有左孩子的节点的树的高度,所以如果先序申请内存,中序遍历更新值得操作无从谈起。可笑我一直在想不可能做到的事。
为啥算val的时候要减去‘0’啊,挠头
字符0-9要算数值直接减去‘0’就是数值,实际上就是ascii码运算
我看题目给出的顺序时层次遍历,可是为什么解答给的是先序遍历?
注意:
以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。
给一个总共只有两行的写法
orz
为什么data[u] == ‘n’然后u = k+1就可以了,当时输入的是NULL么,下一位不应该是u么,有些不理解。
int k = u;
让k
和u
的指向相同,如果当前字符串为"null 1 2"
,则data[k]=date[u]='n'
while(data[k] != ' ') k++;
的含义是如果当前不为空格,则k++
,最后会使得data[k]
一定是空格u = k + 1
可使得u
指向下一个判断的值哦哦,明白了,谢谢大佬
写得很好~
赞~