Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit aba0fd5

Browse files
author
侯利朋
committed
.\1028.recover-a-tree-from-preorder-traversal ok
1 parent e092eb1 commit aba0fd5

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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+
}

0 commit comments

Comments
 (0)