難易度:中等
タイトルの説明:
二分木をシリアル化する1つの方法は、プレオーダートラバーサルを使用することです。空でないノードに遭遇した場合、このノードの値を記録できます。空のノードの場合は、
#などのタグ値レコードを使用できます。
たとえば、上記の二分木は文字列「9,3,4、#、#、1、#、#、2、#、6、#、#」にシリアル化できます。ここで、#は空のノードを表します。
カンマ区切りのシーケンスを指定して、それがバイナリツリーの正しいプレオーダーシリアル化であることを確認します。ツリーを再構築せずに実行可能なアルゴリズムを記述します。
コンマで区切られた各文字は、整数またはヌルポインターを表す「#」のいずれかです。
入力形式は常に有効であると考えることができます。たとえば、「1,3」のように2つの連続したコンマが含まれることはありません。
例1:
入力: "9,3,4、#、#、1、#、#、2、#、6、#、#"出力:true
例2:
入力:「1、#」出力:false
例3:
入力: "9、#、#、1"出力:false
ソース:LeetCode(LeetCode)
リンク:https ://leetcode-cn.com/problems/verify-preorder-serialization-of-a-binary-tree
著作権はLeetCodeが所有しています。商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。
class Solution {
public:
int n;
bool isValidSerialization(string preorder) {
n = preorder.size();
int cnt = 0;
int num = 0;
for(int i=0; i<n; i++) {
if(isdigit(preorder[i])) {
num = 1;
}
else if(preorder[i] == ',') {
cnt += num;
if(cnt < 0 && i != n-1)
return false;
}
else if(preorder[i] == '#') {
num = -1;
}
}
return cnt+num == -1;
}
};