春招打卡|给出前序中序序列建树

107 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

图片.png

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,null,null,15,7]

二、思路分析

  1. 前序遍历的顺序是先遍历根节点,然后左子树,最后右子树。这表明着前序遍历结果的第一个数是整个数的根节点。
  2. 中序遍历的顺序是先遍历左子树,再遍历根,再遍历右子树。这表明中序遍历的数组结果中,根节点的左侧是左子树节点,右侧是右子树节点。
  3. 根据前序遍历和中序遍历的数组结果重建二叉树,前序遍历的第一个节点为根节点,再用该跟节点找到中序数组中的跟节点位置index。
  4. 建立子树可以视为递归过程,root.left 传入前序数组的[1:index]数据,中序数组的[:index]的数据。右子树则传入另一半数据,前序数组[index+1:],中序数组的[i+1:]。

三、AC 代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func buildTree(preorder []int, inorder []int) *TreeNode {
    if len(preorder) == 0 {
        return nil
    }
    root := &TreeNode{preorder[0],nil,nil}
    //找到inorder中根节点位置
    i := 0
    for ;i< len(inorder);i++ {
        if inorder[i] == preorder[0] {
            break
        }
    }
    root.Left = buildTree(preorder[1:i+1],inorder[:i])
    root.Right = buildTree(preorder[i+1:],inorder[i+1:])
    return root
}

四、总结

此题通过使用前序和中序数组的性质,达到重建二叉树的目的,熟悉前序和中序遍历后,可以很快理解这道题目。