likes
comments
collection
share

[路飞] leetcode105. 从前序与中序遍历序列构造二叉树

作者站长头像
站长
· 阅读数 18

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

一、题目描述

leetcode105. 从前序与中序遍历序列构造二叉树

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

示例 1:

[路飞] leetcode105. 从前序与中序遍历序列构造二叉树

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

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

二、思路分析

递归

无需展开理解,利用递归函数的语意信息去进行程序设计。

首先知道,前序遍历(根左右),中序遍历(左根右),可以根据根的位置区分 前序遍历的第一个元素,就是根节点 拿前序遍历的第一个元素找到中序遍历中对应的位置,那么其前半部分就是左子树,后半部分就是右子树

  • 找根节点在前序遍历中的位置
  • 找到根节点位置后,把左子树和右子树拆分出来
  • 拆分出:左子树的前序遍历,左子树的中序遍历;右子树的前序遍历,右子树的中序遍历
  • 创建node

示例 1 [路飞] leetcode105. 从前序与中序遍历序列构造二叉树

三、JavaScript代码

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} preorder
 * @param {number[]} inorder
 * @return {TreeNode}
 */


var buildTree = function(preorder, inorder) {
    if(preorder.length == 0) return null;
    let pos = 0;
    // 找根节点在前序遍历中的位置
    while(preorder[0] != inorder[pos]) pos++;
    // 找到根节点位置后,把左子树和右子树拆分出来
    let l_pre=[], l_in=[], r_pre=[], r_in=[]; // 左子树的前序遍历,左子树的中序遍历;右子树的前序遍历,右子树的中序遍历
    for(let i = 0; i < pos; i++) {
        l_pre.push(preorder[i + 1])
        l_in.push(inorder[i])
    }
    for(let i = pos+1; i < preorder.length; i++) {
        r_pre.push(preorder[i])
        r_in.push(inorder[i])
    }
    // 创建node
    let node = new TreeNode(preorder[0])
    // if(preorder.length == 1) return node;
    node.left = buildTree(l_pre, l_in)
    node.right = buildTree(r_pre, r_in)
    return node
};

四、总结

转载自:https://juejin.cn/post/7078098758470205471
评论
请登录