时间限制:1.000S 空间限制:32MB
题目描述
现给定一棵二叉树的先序遍历序列和中序遍历序列,要求你计算该二叉树的高度。
输入描述
输入包含多组测试数据,每组输入首先给出正整数N(⇐50),为树中结点总数。下面2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出描述
对于每组输入,输出一个整数,即该二叉树的高度。
输入示例
9
ABDFGHIEC
FDHGIBEAC
7
Abcdefg
gfedcbA
输出示例
5
7
答案
package main
import (
"bufio"
"os"
"fmt"
"strconv"
)
var (
n int
preorder []byte
inorder []byte
root *BinaryTreeNode
)
func main() {
input := bufio.NewScanner(os.Stdin)
for input.Scan() {
n, _ = strconv.Atoi(input.Text())
input.Scan()
preorder = []byte(input.Text())
input.Scan()
inorder = []byte(input.Text())
root = buildBinaryTree(preorder, inorder)
fmt.Println(getMaxHeigth(root))
}
}
type BinaryTreeNode struct {
Val byte
Left *BinaryTreeNode
Right *BinaryTreeNode
}
func buildBinaryTree(preorder, 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 := getIdx(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 getIdx(arr []byte, target byte) int {
for i, v := range arr {
if v == target {
return i
}
}
return -1
}
func getMaxHeigth(root *BinaryTreeNode) int {
res := 0
queue := []*BinaryTreeNode{}
if root != nil {
queue = append(queue, root)
}
for len(queue) > 0 {
size := len(queue)
res++
for i := 0; i < size; i++ {
cur := queue[i]
if cur.Left != nil {
queue = append(queue, cur.Left)
}
if cur.Right != nil {
queue = append(queue, cur.Right)
}
}
queue = queue[size:]
}
return res
}