二分木をシリアル化する1つの方法は、プレオーダートラバーサルを使用することです。空でないノードに遭遇した場合、このノードの値を記録できます。空のノードの場合は、#などのタグ値レコードを使用できます。
_9_
/ \
3 2
/ \ / \
4 1 # 6
/ \ / \ / \
# # # # # #
たとえば、上記の二分木は文字列「9,3,4、#、#、1、#、#、2、#、6、#、#」にシリアル化できます。ここで、#は空のノードを表します。
カンマ区切りのシーケンスを指定して、それがバイナリツリーの正しいプレオーダーシリアル化であることを確認します。ツリーを再構築せずに実行可能なアルゴリズムを記述します。
コンマで区切られた各文字は、整数またはNULLポインターを表す「#」のいずれかです。
入力形式は常に有効であると考えることができます。たとえば、「1,3」のように2つの連続したコンマが含まれることはありません。
例1:
入力: "9,3,4、#、#、1、#、#、2、#、6、#、#"
出力:true
設計アイデア:1次キューはルートノード、左側ノード、および右ノードループトラバーサル。各ノードには左ノードと右ノード(+2)があり、ルートノードまたは左ノードまたは右ノード(-1)とも呼ばれます。
代码:
public static boolean isValidSerialization(String preorder) {
String[]a=preorder.split(",");
if(a[0].equals("#")&&a.length==1) {
return true;
}
if(a[0].equals("#")&&a.length!=1) {
return false;
}
int count=1;//记录结点未知的叶子节点数
for(int i=0;i<a.length;i++){
count--;
if(count<0) {
return false;
}
if(!a[i].equals("#")) {
count+=2;
}
}
return count==0;
}