Golang 通过前序遍历和中序遍历构建树,需要从终端读取两行数据,并且事先不知道读取数据的长度,通过fmt.Scanf()实现
func buildTree(preOrder []int, inorder []int) *TreeNode {
if len(preOrder) == 0 {
return nil
}
root := &TreeNode{Val: preOrder[0]}
var i int
for index, value := range inorder {
if value == preOrder[0] {
i = index
break
}
}
root.Left = buildTree(preOrder[1:i+1], inorder[:i])
root.Right = buildTree(preOrder[i+1:], inorder[i+1:])
return root
}
func main() {
var num int
var preOrder, inOrder []int
for {
_, err := fmt.Scanf("%d", &num)
if err == nil {
preOrder = append(preOrder, num)
} else {
break
}
}
for {
_, err := fmt.Scanf("%d", &num)
if err == nil {
inOrder = append(inOrder, num)
} else {
break
}
}
fmt.Println(preOrder)
fmt.Println(inOrder)
root := buildTree(preOrder, inOrder)
}
通过for循环与fmt.Scanf(),当Scanf读到换行符时,err不为nil,终端显示err为unexpected newline
通过err不为nil跳出for循环,第一行数据读完,由于只有两行数据,可以直接复制并修改第一个for循环,如果要读取多行数据的话,可以在嵌套一个for循环
另一种方法,使用bufio
for {
var num []int
reader := bufio.NewReader(os.Stdin)
strBytes, _, _ := reader.ReadLine()
str := strings.Fields(string(strBytes))
for i := range str {
n, _ := strconv.Atoi(str[i])
num = append(num, n)
}
fmt.Println(num)
}