首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >通过先序和中序数组生成后序数组

通过先序和中序数组生成后序数组

作者头像
ppxai
发布2023-11-18 08:29:25
发布2023-11-18 08:29:25
2690
举报
文章被收录于专栏:皮皮星球皮皮星球

通过先序和中序数组生成后序数组

给出一棵二叉树的先序和中序数组,通过这两个数组直接生成正确的后序数组。示例1

输入: [1,2,3],[2,1,3] 输出: [2,3,1]

思路:

题目意思是给出两个数组,一个是二叉树的先序遍历的数组,一个是中序遍历的数组,让求出后序数组。 考虑先序遍历中序遍历和后序遍历的规则,就可以发现,先序数组的第一位一定是root节点,而该节点在后序数组中的左边一定是左子树,节点右边一定是右子树,知道了左子树的大小,就能知道先序数组中,左子树的范围和右子树的范围,依此递归求解就行。

代码:

golang:

代码语言:javascript
复制
/**
 *
 * @param preOrder int整型一维数组 the array1
 * @param inOrder int整型一维数组 the array2
 * @return int整型一维数组
 */
// [1,2,3],[2,1,3]
func findOrder( preOrder []int ,  inOrder []int ) []int {
    if len(preOrder) == 0 || len(inOrder) == 0 {
    	return nil
    }

    // 保存中序数组的下标,加速查找根节点在中序数组中的位置
    indexMap := make(map[int]int, len(inOrder))
    for i, num := range inOrder {
    	indexMap[num] = i
    }

    var res = make([]int, 0)
    genPastOrder(preOrder, 0, len(preOrder) - 1, inOrder, 0, len(inOrder) - 1, indexMap, &res)
    for i,j := 0, len(res)-1; i < j; {
    	res[i], res[j] = res[j], res[i]
    	i++
    	j--
    }
    return res
}

func genPastOrder(preOrder []int, i, j int, inOrder []int, k, l int, indexMap map[int]int, res *[]int) {
    if i > j || k > l || len(*res) == len(preOrder) {
    	return
    }
    // 前序数组的第一个节点一定是根节点
    root := preOrder[i]
    *res = append(*res, root)

    //找到根节点在右子树中的位置
    index := indexMap[root]

    // 右子树
    genPastOrder(preOrder, i + (index - k) + 1, j, inOrder, index+1, l, indexMap, res)
    // 左子树
    genPastOrder(preOrder, i+1, i + (index - k), inOrder, k, index-1, indexMap, res)
    return
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过先序和中序数组生成后序数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档