题目链接一
【Leetcode】106. 从中序与后序遍历序列构造二叉树
思路
此类题型,由先序序列跟中序序列,或者由后序序列跟中序序列,共同点都是需要中序序列,结合先序序列或者后序序列中,递归遍历二叉树的顺序性,找到每一次递归时的根节点在中序序列中的位置,结合边界,当前根节点对应的中序序列,跟后序序列,计算出当前递归时,以及左右子树的中序序列跟后续序列,不断递归构造出跟节点,以及对应的左右子树的关系文章来源:https://www.toymoban.com/news/detail-816449.html
代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(inorder []int, postorder []int) *TreeNode {
// hash表优化查询后序序列中的元素在中序序列中的位置
hash := map[int]int{}
for idx, val := range inorder {
hash[val] = idx
}
// 序列的长度
n := len(inorder)
var fun func(il, ir, pl, pr int) *TreeNode
fun = func(il, ir, pl, pr int) *TreeNode {
// 处理边界
if il > ir {
return nil
}
// 根节点的值
val := postorder[pr]
// 后序数组中,当前节点在中序序列数组中的位置
i := hash[val]
// 以postorder[pl]为根节点时,左子树的节点个数
lenL := i - il
// 新节点
return &TreeNode{
Val: val, // 根节点的值为后序数组中的最后一个元素
Left: fun(il, i-1, pl, pl+lenL-1),// 构造左子树
Right: fun(i+1, ir, pl+lenL, pr-1),// 构造右子树
}
}
// 构造二叉树
return fun(0, n-1, 0, n-1)
}
题目链接二
105. 从前序与中序遍历序列构造二叉树文章来源地址https://www.toymoban.com/news/detail-816449.html
代码
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(preorder []int, inorder []int) *TreeNode {
hash := map[int]int{}
for idx, val := range inorder {
hash[val] = idx
}
n := len(inorder)
var fun func (il, ir, pl, pr int) *TreeNode
fun = func (il, ir, pl, pr int) *TreeNode{
if il > ir {
return nil
}
// 根据先序序列获取到的当前根节点
val := preorder[pl]
// 根节点在中序序列中的位置
i := hash[val]
lenL := i - il
return &TreeNode{
Val : val,
Left : fun(il, i-1, pl+1, pl + lenL),
Right : fun(i+1, ir, pl + lenL + 1, pr),
}
}
return fun(0, n-1, 0, n-1)
}
到了这里,关于【Leetcode】106. 从中序与后序遍历序列构造二叉树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!