This repository has been archived on 2021-09-07. You can view files and clone it, but cannot push or open issues or pull requests.
2018-12-07 13:22:52 +08:00

134 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import "fmt"
// 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
/*
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
*/
var indexForInorders map[int]int
func init() {
indexForInorders = make(map[int]int)
}
type Node struct {
value int // 值
left *Node // 左节点
right *Node // 右节点
}
// 之前的操作,传入前序遍历和中序遍历
func preBinaryTree(pre []int, in []int) *Node {
// 将中序遍历的值和索引倒过来
for k, v := range in {
indexForInorders[v] = k
}
return inBinaryTree(pre, 0, len(pre)-1, 0)
}
// 前序遍历序列 序列左序列右中序遍历左定界package main
//
//import "fmt"
//
//// 根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
//
///*
//preorder = [3,9,20,15,7]
//inorder = [9,3,15,20,7]
//*/
//
//var indexForInorders map[int]int
//
//func init() {
// indexForInorders = make(map[int]int)
//}
//
//type Node struct {
// value int // 值
// left *Node // 左节点
// right *Node // 右节点
//}
//
//// 之前的操作,传入前序遍历和中序遍历
//func preBinaryTree(pre []int, in []int) *Node {
// // 将中序遍历的值和索引倒过来
// for k, v := range in {
// indexForInorders[v] = k
// }
// return inBinaryTree(pre, 0, len(pre)-1, 0)
//}
//
//// 前序遍历序列 序列左,序列右,中序遍历左定界
//func inBinaryTree(pre []int, l int, r int, inL int) *Node {
// if l > r {
// return nil
// }
//
// // 根节点(第一个元素是根节点)
// root := &Node{value: pre[l]}
//
// // 左限制就是前置序列的下一个元素
// // 右限制就是左限制加上到中间元素
// i := indexForInorders[pre[l]] // 中序遍历的根节点的索引
// ii := i - inL
// root.left = inBinaryTree(pre, l+1, l+ii, inL)
// root.right = inBinaryTree(pre, l+ii+1, r, inL+ii+1)
// return root
//}
//
//// 打印node
//func (n *Node) print() {
// if n.left != nil {
// n.left.print()
// }
// fmt.Print(n.value, " ")
// if n.right != nil {
// n.right.print()
// }
//}
//
//func main() {
// pre := []int{3, 9, 20, 15, 7}
// in := []int{9, 3, 15, 20, 7}
// r := preBinaryTree(pre, in)
// r.print()
//}
func inBinaryTree(pre []int, l int, r int, inL int) *Node {
if l > r {
return nil
}
// 根节点(第一个元素是根节点)
root := &Node{value: pre[l]}
// 左限制就是前置序列的下一个元素
// 右限制就是左限制加上到中间元素
i := indexForInorders[pre[l]] // 中序遍历的根节点的索引
ii := i - inL
root.left = inBinaryTree(pre, l+1, l+ii, inL)
root.right = inBinaryTree(pre, l+ii+1, r, inL+ii+1)
return root
}
// 打印node
func (n *Node) print() {
if n.left != nil {
n.left.print()
}
fmt.Print(n.value, " ")
if n.right != nil {
n.right.print()
}
}
func main() {
pre := []int{3, 9, 20, 15, 7}
in := []int{9, 3, 15, 20, 7}
r := preBinaryTree(pre, in)
r.print()
}