feat: monday
This commit is contained in:
@@ -0,0 +1,65 @@
|
|||||||
|
package constructbinarytreefrompreorderandinordertraversal
|
||||||
|
|
||||||
|
type TreeNode struct {
|
||||||
|
Val int
|
||||||
|
Left *TreeNode
|
||||||
|
Right *TreeNode
|
||||||
|
}
|
||||||
|
|
||||||
|
type NodeInfo struct {
|
||||||
|
Val int
|
||||||
|
Preorder int
|
||||||
|
Inorder int
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildTreeInfo(info []NodeInfo) *TreeNode {
|
||||||
|
if len(info) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
root_info := info[0]
|
||||||
|
for _, datum := range info {
|
||||||
|
if datum.Preorder < root_info.Preorder {
|
||||||
|
root_info = datum
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
left_info := []NodeInfo{}
|
||||||
|
right_info := []NodeInfo{}
|
||||||
|
for _, datum := range info {
|
||||||
|
if datum.Inorder < root_info.Inorder {
|
||||||
|
left_info = append(left_info, datum)
|
||||||
|
} else if datum.Inorder > root_info.Inorder {
|
||||||
|
right_info = append(right_info, datum)
|
||||||
|
} else {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return &TreeNode{
|
||||||
|
Val: root_info.Val,
|
||||||
|
Left: buildTreeInfo(left_info),
|
||||||
|
Right: buildTreeInfo(right_info),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildTree(preorder []int, inorder []int) *TreeNode {
|
||||||
|
info_map := map[int]*NodeInfo{}
|
||||||
|
for o, v := range preorder {
|
||||||
|
info_map[v] = &NodeInfo{
|
||||||
|
Val: v,
|
||||||
|
Preorder: o,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for o, v := range inorder {
|
||||||
|
info_map[v].Inorder = o
|
||||||
|
}
|
||||||
|
|
||||||
|
info := []NodeInfo{}
|
||||||
|
for _, datum := range info_map {
|
||||||
|
info = append(info, *datum)
|
||||||
|
}
|
||||||
|
|
||||||
|
return buildTreeInfo(info)
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user