技巧
递归构建树 二叉树后序遍历
思路
递归构建树 二叉树后序遍历
实现
package main
import (
"bufio"
. "fmt"
"io"
"os"
)
type Node struct {
left, right *Node
t string
}
func buildTree(s string, l, r int) *Node {
if l == r {
t := "B"
if string(s[l]) == "1" {
t = "I"
}
return &Node{nil, nil, t}
} else if l < r {
mid := l + (r-l)/2
left := buildTree(s, l, mid)
right := buildTree(s, mid+1, r)
t := "F"
if left.t == "I" && right.t == "I" {
t = "I"
} else if left.t == "B" && right.t == "B" {
t = "B"
}
return &Node{left, right, t}
}
return nil
}
// https://ac.nowcoder.com/acm/problem/16660
func NC16660(_r io.Reader, _w io.Writer) {
in, out := bufio.NewReader(_r), bufio.NewWriter(_w)
defer out.Flush()
var n int
var s string
Fscan(in, &n, &s)
FBITree := buildTree(s, 0, len(s)-1)
var postOrder func(*Node)
postOrder = func(node *Node) {
if node == nil {
return
}
postOrder(node.left)
postOrder(node.right)
Fprint(out, node.t)
}
postOrder(FBITree)
}
func main() {
NC16660(os.Stdin, os.Stdout)
}

京公网安备 11010502036488号