示例:
你可以將以下二叉樹:
1/ \
2 3
/ \4 5
序列化為 "[1,2,3,null,null,4,5]"
2.1 思路分析題目要求的"序列化"和"反序列化"是可逆操作。因此,序列化的字串應該攜帶"完整的"二叉樹資訊,即擁有單獨表示二叉樹的能力。
為使反序列化可行,考慮將越過葉節點的null也看作節點。如果是這樣,對於列表中任意結點node,其左子結點node.left和右子結點node.right在序列中的位置是唯一確定的。
設m為列表區間[0,n]中空節點(即null)的個數,則可總結出node、node.left、node.right在列表索引中的對應關係:
2.2.1 序列化serialize
特例處理:若root為空,則直接返回空列表"[ ]";
初始化:佇列queue(包含根節點root);序列化列表res;
層序遍歷:當queue為空時跳出
1.節點出隊,記為node;
2.若node不為空,列印字串node.val,將左、右子節點加入到queue;
3.若node為空,則列印字串"null";
4.返回值:拼接列表(用『,』隔開,首尾新增中括號)。
2.2.2 序列化**實現
public string serialize(treenode root) else
}res.deletecharat(res.length()-1);
return res.tostring();
}
2.2.3 複雜度分析2.3.1 反序列化deserialize特例處理:若data為空,直接返回null;
初始化:序列化列表vals(先去掉首尾中括號,再用逗號隔開),指標i = i,根節點root( 值為vals[0] ),佇列queue(包含root);
按層構建:當queue為空時跳出
1.節點出隊,記為node;
2.構建node的左子節點:node.left的值為vals[i],並將node.left入隊;
3.執行i += 1;
4.構建node的右子節點:node.right的值為vals[i],並將node.right入隊;
5.執行i += 1;
4.返回值:返回根節點root即可。
2.3.2 反序列化**實現
public treenode deserialize(string data) };
int i = 1;
while(!queue.isempty())
i++;
if(!vals[i].equals("null"))
i++;
}return root;
}
2.3.3 複雜度分析
public class codec else
}res.deletecharat(res.length()-1);
return res.tostring();
}// decodes your encoded data to tree.
public treenode deserialize(string data) };
int i = 1;
while(!queue.isempty())
i++;
if(!vals[i].equals("null"))
i++;
}return root;}}
序列化二叉樹和反序列化二叉樹
題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點...
序列化二叉樹
問題 實現兩個函式,序列化乙個二叉樹。如果之前做過乙個題目 用一顆二叉樹的中序和前序還原二叉樹的話,最直觀的解法是用把二叉樹系列化成乙個中序序列和乙個前序序列,但是這個方法的缺陷是每個節點上的值不能相同,而且需要將整個序列都讀入之後才能序列化,如果序列到乙個流中,在從流中讀出來還原二叉樹效率將會比較...
序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 序列化思路 如果二叉樹的序列化是從根節點開始的話,那麼相應的反序列化在根節點的數值對出來的時候就可以開始了,因此我們可以根據前序遍歷的的根節點數值在讀出來的時候就可以開始了,因此我們可以根據前序遍歷的順序來序列化二叉樹,因為前序遍歷是從根節點開始的。當...