func BuildTreeFromInOrderAndPreOrder(inorder, preorder []int) *NodeTree { return BuildTree(preorder, inorder, 0, len(preorder)-1, 0, len(inorder)-1) } func BuildTree(preOrder, inOrder []int, prestart, preend, instart, inend int) *NodeTree { if instart > inend { return nil } root := &NodeTree{Data: preOrder[prestart]} position := FindPosition(inOrder, instart, inend, root.Data) if position < 0 { return root //这个证明此节点为叶节点 } // | |左子树节点数 | root.Left = BuildTree(preOrder, inOrder, prestart+1, prestart+position-instart, instart, position-1) // |右子树节点个数,值为负|当前树总结点个数| root.Right = BuildTree(preOrder, inOrder, position-inend+preend+1, preend, position+1, inend) return root } func FindPosition(arr []int, start, end int, key int) int { for i := start; start < end; i++ { if arr[i] == key { return i } } return -1 }