File tree Expand file tree Collapse file tree 1 file changed +76
-0
lines changed Expand file tree Collapse file tree 1 file changed +76
-0
lines changed Original file line number Diff line number Diff line change
1
+ /**
2
+ * Definition for a binary tree node.
3
+ * type TreeNode struct {
4
+ * Val int
5
+ * Left *TreeNode
6
+ * Right *TreeNode
7
+ * }
8
+ */
9
+ // 12 ms, faster than 95.92%
10
+ func recoverFromPreorder (S string ) * TreeNode {
11
+ nodes := [][]int {} // [depth,val]
12
+ for i := 0 ; i < len (S ); {
13
+ dep := 0
14
+ for i < len (S ) && S [i ] == '-' {
15
+ dep ++
16
+ i ++
17
+ }
18
+ node := []int {dep , 0 }
19
+ l := i
20
+ for i < len (S ) && S [i ] != '-' {
21
+ i ++
22
+ }
23
+ node [1 ], _ = strconv .Atoi (S [l :i ])
24
+ nodes = append (nodes , node )
25
+ }
26
+ return pre (nodes )
27
+ }
28
+
29
+ //
30
+ func pre (nodes [][]int ) * TreeNode {
31
+ if len (nodes ) == 0 {
32
+ return nil
33
+ }
34
+ if len (nodes ) == 1 {
35
+ return & TreeNode {nodes [0 ][1 ], nil , nil }
36
+ }
37
+
38
+ root := & TreeNode {}
39
+ root .Val = nodes [0 ][1 ]
40
+ dep := nodes [0 ][0 ]
41
+
42
+ if nodes [1 ][0 ] == nodes [0 ][0 ]+ 1 {
43
+ // 找 dep+1 切分两块
44
+ i := 2
45
+ for ; i < len (nodes ); i ++ {
46
+ if nodes [i ][0 ] == dep + 1 {
47
+ break
48
+ }
49
+ }
50
+ if i == len (nodes ) {
51
+ // 右子树为nil
52
+ root .Right = nil
53
+ } else {
54
+ root .Right = pre (nodes [i :])
55
+ }
56
+ root .Left = pre (nodes [1 :i ])
57
+ } else {
58
+ // 左子树为nil
59
+ root .Left = nil
60
+ // 找 dep+1 切分两块
61
+ i := 2
62
+ for ; i < len (nodes ); i ++ {
63
+ if nodes [i ][0 ] == dep + 1 {
64
+ break
65
+ }
66
+ }
67
+ if i == len (nodes ) {
68
+ // 右子树为nil
69
+ root .Right = nil
70
+ } else {
71
+ root .Right = pre (nodes [i :])
72
+ }
73
+ }
74
+
75
+ return root
76
+ }
You can’t perform that action at this time.
0 commit comments