/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func caller(inorder []int, postorder []int, indexMap map[int]int, inOrderStart,
inOrderEnd, postOrderStart, postOrderEnd int) *TreeNode {
if inOrderEnd < inOrderStart || postOrderEnd < postOrderStart {
return nil
}
//后续遍历的最后一个节点,就是根节点
rootValue := postorder[postOrderEnd]
//找到根节点在中序遍历中的位置
rootIndex := indexMap[rootValue]
node := &TreeNode{}
node.Val = rootValue
node.Left = caller(inorder, postorder, indexMap, inOrderStart, rootIndex - 1, postOrderStart,
postOrderStart + rootIndex - inOrderStart - 1)
node.Right = caller(inorder, postorder, indexMap, rootIndex + 1, inOrderEnd, postOrderStart + rootIndex - inOrderStart, postOrderEnd - 1)
return node
}
func buildTree(inorder []int, postorder []int) *TreeNode {
indexMap := make(map[int]int)
for index, value := range inorder {
indexMap[value] = index
}
return caller(inorder, postorder, indexMap, 0, len(inorder) - 1, 0, len(inorder) - 1)
}
从中序与后序遍历序列构造二叉树递归做法
最新推荐文章于 2022-11-19 15:50:07 发布
该博客主要介绍了如何通过给定的中序和后序遍历结果来重建二叉树。它提供了一个名为`buildTree`的函数,首先创建一个映射来存储中序遍历中每个节点的索引,然后使用递归的`caller`函数来构建树的左右子节点。这种方法的关键在于确定根节点并依据中序遍历来划分左右子树的边界。

1730

被折叠的 条评论
为什么被折叠?



