时间限制:1.000S  空间限制:32MB

题目描述

给你一棵二叉树的前序遍历和中序遍历结果,要求你写出这棵二叉树的后序遍历结果。

输入描述

输入包含多组测试数据。每组输入包含两个字符串,分别表示二叉树的前序遍历和中序遍历结果。每个字符串由不重复的大写字母组成。

输出描述

对于每组输入,输出对应的二叉树的后续遍历结果。

输入示例
DBACEGF ABCDEFG
BCAD CBAD
输出示例
ACBFGED
CDAB

答案

package main
 
import (
    "bufio"
    "os"
    "fmt"
    "strings"
)
 
var (
    arr []string
    preorder []byte
    inorder []byte
    tree *BinaryTreeNode
)
 
func main() {
    input := bufio.NewScanner(os.Stdin)
    for input.Scan() {
        arr := strings.Fields(input.Text())
        preorder = []byte(arr[0])
        inorder = []byte(arr[1])
        tree = buildBinaryTree(preorder, inorder)
        printPostorder(tree)
        fmt.Println()
    }
}
 
type BinaryTreeNode struct {
    Val byte
    Left *BinaryTreeNode
    Right *BinaryTreeNode
}
 
func buildBinaryTree(preorder []byte, inorder []byte) *BinaryTreeNode {
    n1 := len(preorder)
    n2 := len(inorder)
    if n1 != n2 {
        panic("preorder and inorder len not equal")
    }
    if n1 == 0 {
        return nil
    }
    node := &BinaryTreeNode{ Val: preorder[0] }
    idx := findIdx(inorder, preorder[0])
    if idx == -1 {
        panic("preorder and inorder mismatch")
    }
    node.Left = buildBinaryTree(preorder[1:idx + 1], inorder[:idx])
    node.Right = buildBinaryTree(preorder[idx + 1:], inorder[idx + 1:])
    return node
}
 
func findIdx(arr []byte, target byte) int {
    for i, v := range arr {
        if v == target {
            return i
        }
    }
    return -1
}
 
func printPostorder(head *BinaryTreeNode) {
    if head == nil {
        return
    }
    printPostorder(head.Left)
    printPostorder(head.Right)
    fmt.Printf("%c", head.Val)
}