传送门:https://leetcode-cn.com/probl...
学二叉树时,有一条性质是
“如果给出了遍历二叉树的前序序列和中序序列,则可以构造出唯一的一颗二叉树”
所以对于这题来说,总的思路可以按照这条性质来解。由于题目的条件是“平衡二叉树”,所以解题过程可以更进一步简化为:
对于每一棵子树,其序列化串为S,
- 若可以找到子串S[i1....in]>S[0],则按照i1将S分割为左子树与右子树;
- 若不能找到这样的子串,说明其都在左子树上;
- 相对应的,若i1 = 1,即都在右子树上。
递归上面的过程既可将序列化串反序列化。
由于树的结构,序列化时按','将每个节点分隔开。
class Codec {
public:
string serialize(TreeNode* root) {
string result;
getFront(root,result);
return result;
}
void getFront(TreeNode* root,string &result){
if(!root) return;
result+=to_string(root->val)+",";
if(root->left){getFront(root->left,result);}
if(root->right){getFront(root->right,result);}
}
TreeNode* deserialize(string data) {
if(data.length()==0||data.length()==1) return 0;
TreeNode *result = new TreeNode;
int i=0;result->val = 0;
for(;data[i]!=','&&i<data.length();++i){
result->val = result->val * 10 + data[i]-'0';
}
//求解S[i1....in],begin指向第一个字符,end指向最后一个','
string left,right;int start = ++i;int end = i-1;
for(;i<data.length();++i){
int tmp = 0;
for(;data[i]!=',';++i){
tmp=tmp * 10 + data[i]-'0';
}
if(tmp>result->val) break;
else end = i;
}
if(start<end){
left = data.substr(start,end-start+1);
TreeNode *nl = deserialize(left);
if(nl) result->left = nl;
}
if(end!=data.length()-1){
right = data.substr(end+1,data.length()-end);
TreeNode *nr = deserialize(right);
if(nr) result->right = nr;
}
return result;
}
};
效果一般
尝试一下层次遍历
按照层次遍历生成序列化串,若节点为空,则生成空格代替数字。
难点在于重新生成树。容易理解,由于生成串时将空节点的位置也留了出来,在反序列化时,再次按照根节点进行遍历,序列化串每个点的位置是相对应的。
再次层次遍历:
TreeNode* deserialize(string data) {
if(data.length()==0) return 0x00;
TreeNode *result = new TreeNode();
queue<TreeNode*> que;
que.push(result);
for(int i=0;i<data.length();++i){
int tmp = 0;
TreeNode *tmpN = que.front();
que.pop();
if(data[i]==' '){
if(tmpN->left) tmpN->left->left = 0x00;
if(tmpN->right) tmpN->right->right = 0x00;
++i;continue;
}
for(;data[i]!=',';++i) tmp = tmp*10 + data[i]-'0';
tmpN->val = tmp;
//在这里就要分配空间。当压进队列取出来后再分配空间则接不上其父节点
tmpN->left = 0x00;tmpN->left = new TreeNode();
//借用左节点,若为空则能够找到父节点,并将父节点左子树置空。同右节点
tmpN->left->left=tmpN;
que.push(tmpN->left);
tmpN->right = 0x00;tmpN->right = new TreeNode();
tmpN->right->right=tmpN;
que.push(tmpN->right);
}
return result;
}
结果是好了点。
297题同该题:https://leetcode-cn.com/probl...
只需要利用层次遍历的方法(因为这道题是二叉树,非平衡树,方法1不适用)
只需要判断+-一下即可
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。