0%

LeetCode-331

题目

331. 验证二叉树的前序序列化

结果

代码

一个非空的节点必须要有两个子节点,根据这个关系,可以得出一个基于“期望节点数”算法:

  • 遇到数字 父节点的期望节点数减一,当前节点的期望节点数置为二。
  • 遇到空节点, 只需将父节点的期望节点数减一

最后判断所有节点的期望节点数是否为0,这个过程可以用栈很好的模拟。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
func isValidSerialization(preorder string) bool {
s := strings.Split(preorder, ",")
stk := []int{1}

for _, v := range s {
if len(stk) == 0 {
return false
}
stk[len(stk)-1]--
if stk[len(stk)-1] == 0 {
// stack pop
stk = stk[:len(stk)-1]
}
if unicode.IsDigit(str2rune(v)) {
stk = append(stk, 2)
}
}
return len(stk) == 0
}

func str2rune(s string) rune {
return rune(s[0])
}

复杂度

时间复杂度:O(n)

空间复杂度:O(n)