331.verify-preorder-serialization-of-a-binary-tree.go 664 B

12345678910111213141516171819202122232425262728293031323334353637
  1. func isValidSerialization(preorder string) bool {
  2. tree := strings.Split(preorder, ",")
  3. n := len(tree)
  4. if n == 0 || (n == 1 && tree[0] != "#") || (tree[0] == "#" && 1 < n) {
  5. return false
  6. }
  7. st := []int{-1} // 0 for left, and 1 for right
  8. l, i, next := 1, 1, 0
  9. for ; i < n && l != 0; i++ {
  10. if next == 0 {
  11. st = append(st, 0)
  12. l++
  13. if tree[i] == "#" {
  14. next = 1
  15. }
  16. } else {
  17. if tree[i] == "#" {
  18. l--
  19. st = st[:l]
  20. for 2 < l && st[l-1] == 1 {
  21. l--
  22. if st[l-1] != 0 {
  23. return false
  24. }
  25. l--
  26. st = st[:l]
  27. }
  28. } else {
  29. st = append(st, 1)
  30. l++
  31. next = 0
  32. }
  33. }
  34. }
  35. return len(st) == 1 && i == n
  36. }