【Leetcode】106. 从中序与后序遍历序列构造二叉树

【Leetcode】106. 从中序与后序遍历序列构造二叉树

题目链接一

【Leetcode】106. 从中序与后序遍历序列构造二叉树

思路

此类题型,由先序序列跟中序序列,或者由后序序列跟中序序列,共同点都是需要中序序列,结合先序序列或者后序序列中,递归遍历二叉树的顺序性,找到每一次递归时的根节点在中序序列中的位置,结合边界,当前根节点对应的中序序列,跟后序序列,计算出当前递归时,以及左右子树的中序序列跟后续序列,不断递归构造出跟节点,以及对应的左右子树的关系

代码

/**
 * 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. 从前序与中序遍历序列构造二叉树

代码

/**
 * 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) 
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-18 06:30:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-18 06:30:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-18 06:30:04       82 阅读
  4. Python语言-面向对象

    2024-01-18 06:30:04       91 阅读

热门阅读

  1. 代码重构 —— 化繁为简

    2024-01-18 06:30:04       64 阅读
  2. 【排序算法】排序算法的复杂度

    2024-01-18 06:30:04       61 阅读
  3. Jenkins 敏感信息实战指南

    2024-01-18 06:30:04       56 阅读
  4. 使用docker-compose搭建gitlab

    2024-01-18 06:30:04       51 阅读
  5. C语言所有字符串函数举例如何使用

    2024-01-18 06:30:04       56 阅读
  6. ubuntu18.04clion无法进入断点

    2024-01-18 06:30:04       60 阅读
  7. ubuntu 20.04 docker及nvidia-docker2安装

    2024-01-18 06:30:04       48 阅读
  8. Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

    2024-01-18 06:30:04       47 阅读
  9. ubuntu 22.04 安装 device-tree-compiler (dtc)

    2024-01-18 06:30:04       53 阅读
  10. mybatis-Plus 的自动填充

    2024-01-18 06:30:04       48 阅读