|
@@ -0,0 +1,37 @@
|
|
|
+func isValidSerialization(preorder string) bool {
|
|
|
+ tree := strings.Split(preorder, ",")
|
|
|
+ n := len(tree)
|
|
|
+ if n == 0 || (n == 1 && tree[0] != "#") || (tree[0] == "#" && 1 < n) {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ st := []int{-1} // 0 for left, and 1 for right
|
|
|
+ l, i, next := 1, 1, 0
|
|
|
+ for ; i < n && l != 0; i++ {
|
|
|
+ if next == 0 {
|
|
|
+ st = append(st, 0)
|
|
|
+ l++
|
|
|
+ if tree[i] == "#" {
|
|
|
+ next = 1
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if tree[i] == "#" {
|
|
|
+ l--
|
|
|
+ st = st[:l]
|
|
|
+ for 2 < l && st[l-1] == 1 {
|
|
|
+ l--
|
|
|
+ if st[l-1] != 0 {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ l--
|
|
|
+ st = st[:l]
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ st = append(st, 1)
|
|
|
+ l++
|
|
|
+ next = 0
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return len(st) == 1 && i == n
|
|
|
+}
|
|
|
+
|