标签:ftp fun 中序遍历 range code 特性 uil == 排序二叉树
已知二叉树前序遍历和中序遍历的结果,重建二叉树
解决思路:
例如 pre=[1,2,4,7,3,5,6,8] mid=[4,7,2,1,5,3,8,6]
最终二叉树为[1,2,3,4,null,5,6,null,7,null,null,null,null,8]
1
2 3
4 5 6
7 8
func main() {
pre := []int{1, 2, 4, 7, 3, 5, 6, 8} // 根节点
mid := []int{4, 7, 2, 1, 5, 3, 8, 6}
root := new(node)
reBuildTree(root, pre, mid)
// 前序遍历
preV(root)
fmt.Println()
// 中序遍历
midV(root)
fmt.Println()
}
// 重建左子树
func reBuildTree(root *node, pre, mid []int) {
if len(pre) == 0 {
return
}
// 确定根节点
root.val = pre[0]
var idx int
for ; mid[idx] != pre[0]; idx++ {
}
//左子树
leftMid := mid[:idx]
leftPre := pre[1:len(leftMid)+1]
if len(leftPre) > 0 {
n := new(node)
root.left = n
reBuildTree(n, leftPre, leftMid)
}
// 右子树
rightMid := mid[idx+1:]
rightPre := pre[len(leftMid)+1:]
if len(rightPre) > 0 {
n := new(node)
root.right = n
reBuildTree(n, rightPre, rightMid)
}
}
// 前序遍历
func preV(root *node) {
if root != nil {
fmt.Print(root.val)
preV(root.left)
preV(root.right)
}
}
// 中序遍历
func midV(root *node) {
if root != nil {
midV(root.left)
fmt.Print(root.val)
midV(root.right)
}
}
output:
12473568
47215386
func main() {
pre := []int{1, 2, 4, 7, 3, 5, 6, 8} // 根节点
mid := []int{4, 7, 2, 1, 5, 3, 8, 6}
// 排序二叉树,中序遍历顺序递增
sortM := make(map[int]int, len(mid))
for i, v := range mid {
sortM[v] = i
}
root := new(node)
root.val = pre[0]
// 按照前序遍历的顺序插入节点
for _, v := range pre {
insert(v, root, sortM)
}
// 前序遍历
preV(root)
fmt.Println()
// 中序遍历
midV(root)
fmt.Println()
}
func insert(data int, root *node, sortM map[int]int) {
if sortM[data] < sortM[root.val] {
if root.left != nil {
insert(data, root.left, sortM)
} else {
root.left = &node{val: data}
return
}
} else {
if root.right != nil {
insert(data, root.right, sortM)
} else {
root.right = &node{val: data}
}
}
}
output:
12473568
47215386
标签:ftp fun 中序遍历 range code 特性 uil == 排序二叉树
原文地址:https://www.cnblogs.com/fwdqxl/p/10049510.html