首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从preorder和inorder遍历构建二叉树

从preorder和inorder遍历构建二叉树是一个常见的编程问题。以下是一个使用Python实现的解决方案:

代码语言:python
代码运行次数:0
复制
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def buildTree(preorder, inorder):
    if not preorder or not inorder:
        return None
    root_val = preorder[0]
    root_index = inorder.index(root_val)
    left_inorder = inorder[:root_index]
    right_inorder = inorder[root_index+1:]
    left_preorder = preorder[1:1+len(left_inorder)]
    right_preorder = preorder[1+len(left_inorder):]
    left_tree = buildTree(left_preorder, left_inorder)
    right_tree = buildTree(right_preorder, right_inorder)
    return TreeNode(root_val, left_tree, right_tree)

这个解决方案首先定义了一个TreeNode类,用于表示二叉树的节点。然后,定义了一个buildTree函数,该函数接受两个列表作为参数:preorderinorderpreorder列表表示前序遍历,inorder列表表示中序遍历。

函数首先检查preorderinorder列表是否为空,如果为空,则返回None。接下来,根据preorder列表的第一个元素(即根节点的值)找到inorder列表中的根节点位置。然后,将inorder列表分为左子树和右子树的列表,以及preorder列表分为左子树和右子树的前序遍历列表。

接下来,递归地调用buildTree函数,分别使用左子树的前序遍历和中序遍历列表以及右子树的前序遍历和中序遍历列表来构建左子树和右子树。最后,返回一个新的TreeNode实例,其中包含根节点的值、左子树和右子树。

这个解决方案的时间复杂度为O(n),其中n是二叉树中节点的数量。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【算法】重建二叉树并进行后序遍历的Java实现

后序遍历 代码实现 代码解释 总结 在二叉树的问题中,给定二叉树的前序遍历Preorder中序遍历Inorder)序列,如何求得其后序遍历(Postorder)序列是一个经典的面试题。...本文将详细介绍如何通过Java实现这一过程。 问题描述 前序遍历Preorder):按根节点 -> 左子树 -> 右子树的顺序访问节点。...给定前序遍历中序遍历序列,我们需要构建二叉树并输出其后序遍历序列。 实现思路 重建二叉树:利用前序遍历中序遍历的特性,通过递归方法重建二叉树。...在中序遍历中找到该根节点的位置,可以将中序遍历数组分为左子树右子树两部分。递归地对这两部分继续构建左右子树。 2....buildTree 方法:接受前序遍历中序遍历数组,构建并返回二叉树的根节点。 buildTreeHelper 方法:递归地构建二叉树

12210
  • 二叉树构建(已知两个遍历结果,来构建二叉树

    一、从前序与中序遍历构建二叉树 假如有这样一棵二叉树,它的前序遍历为1 2 4 5 3 6 ,中序遍历为 4 2 5 1 6 3 图文分析: 根节点为前序遍历的第一个节点 然后通过前序遍历得到的根节点以及形成的中序遍历结构进行左右子树划分...// 递归地构造左子树,并连接到根节点 // 先序遍历中「 左边界+1 开始的 size_left_subtree」个元素就对应了中序遍历中「 左边界 开始到 根节点定位-1」的元素...preorder, inorder, 0, n - 1, 0, n - 1); } }; 二、从中序后序遍历构造二叉树 图文演示: 假如有这样一棵二叉树,它的后序遍历为4 5 2 6 3 1...= i; } return dfs(inorder, postorder, 0, n - 1, 0, n - 1); } }; 三、根据前序后序遍历构造二叉树​​​​​​...这个知前序后序遍历构建二叉树得到的二叉树不唯一 代码演示:(双指针法) 考虑到后序遍历的倒数第二个节点刚好为右节点。

    10010

    手把手教你如何重建二叉树(超精彩配图)

    一、二叉树的重建 在LeetCode中有这么一道算法题:《重建二叉树》 (一)面试题07. 重建二叉树 面试题07. 重建二叉树 输入某二叉树的前序遍历中序遍历的结果,请重建该二叉树。...\ 15 7 限制: 0 <= 节点个数 <= 5000 (二)分析该题目 题目中可以看到,给出了两个数组,一个书前序遍历二叉树得出的结果,一个是中序遍历二叉树得出的结果。...利用这两个结果,来还原出一颗二叉树。 首先你要知道什么是前序遍历中序遍历。你还要知道,给你一颗二叉树,使用这些遍历的算法怎么得到遍历的结果,不然是没办法继续完成重建二叉树的。...*/ public class Solution { /** * 根据前序中序遍历二叉树的结果构建二叉树 * @param preorder 前序遍历结果的数组.../** * 根据前序中序遍历二叉树的结果构建二叉树 * @param preorder 前序遍历结果的数组 * @param inorder 中序遍历结果的数组

    38930

    剑指Offer面试题:5.重建二叉树

    一、题目:重建二叉树 题目:输入某二叉树的前序遍历中序遍历的结果,请重建出该二叉树。假设输入的前序遍历中序遍历的结果中都不含重复的数字。...例如输入前序遍历序列{1,2,4,7,3,5,6,8}中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点。  ?...在二叉树的前序遍历中序遍历的序列中确定根结点的值、左子树结点的值右子树结点的值的步骤如下图所示:   分别找到了左、右子树的前序遍历序列中序遍历序列,我们就可以用同样的方法分别去构建左右子树。...在前序遍历中序遍历的序列中划分了左、右子树结点的值之后,就可以递归地去分别构建它的左右子树。...; } }   该方法首先接收参数,依次打印先序遍历中序遍历,最后通过调用Construct方法获得重建的二叉树的根节点,并实例化一个二叉树的数据结构(本处的二叉树结构的实现请阅读

    49340

    N叉树问题-LeetCode 429、589、590、105、106(构建二叉树,N叉树遍历

    作者:TeddyZhang,公众号:算法工程师之路 1 编程题 二叉树拓展到N叉树思路 先序中入栈顺序先右后左 --> 孩子节点数组右向左入栈 后序中入栈顺序先左后右 --> 孩子节点数组左向右入栈...例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: ?...同理得到右子树的前序中序遍历,那么这样就变成了两个个子问题 --> 递归的构建根节点的左右子树,即得到答案! /** * Definition for a binary tree node....【LeetCode #106】从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树。...同理得到右子树的后序中序遍历,那么这样就变成了两个个子问题 --> 递归的构建根节点的左右子树,即得到答案! /** * Definition for a binary tree node.

    1.2K20

    LeetCode——遍历序列构造二叉树

    105从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder inorder ,其中 preorder二叉树的先序遍历inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点...preorder.length -3000 <= preorder[i], inorder[i] <= 3000 preorder inorder 均无重复元素 inorder 均出现在 preorder...preorder 保证为二叉树的前序遍历序列 inorder 保证为二叉树的中序遍历序列 原题目链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal...106从中序与后序遍历序列构造二叉树 给定两个整数数组 inorder postorder ,其中 inorder二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗二叉树...) break; i++; } pos--;//后往前遍历 root->right = section

    23120

    Python算法——树的重建

    Python中的树的重建算法详解 树的重建(Tree Reconstruction)是一种给定的遍历序列中恢复原树结构的算法。...在本文中,我们将讨论树的重建问题以及常见的重建算法,包括先序遍历中序遍历序列重建二叉树,以及层序遍历序列重建二叉树。我们将提供Python代码实现,并详细说明每个算法的原理步骤。 1....先序遍历中序遍历序列重建二叉树 给定一个二叉树的先序遍历序列中序遍历序列,我们可以通过递归地进行树的重建。...层序遍历序列重建二叉树 给定一个二叉树的层序遍历序列,我们可以使用队列来逐层构建树结构。队列中的每个元素代表一个树节点,我们按照层序遍历的顺序依次将节点加入队列,并根据队列中的顺序建立树的连接关系。...Reconstructed Tree from Level Order: 9 3 15 20 7 以上两个示例演示了树的重建算法的使用,分别使用先序遍历中序遍历序列,以及层序遍历序列重建二叉树

    19010

    重建二叉树

    题目描述 输入某二叉树的前序遍历中序遍历的结果,请构建二叉树并返回其根节点。 假设输入的前序遍历中序遍历的结果中都不含重复的数字。...: [-1] 限制: 0 <= 节点个数 <= 5000 思考 我们知道,前序中序的遍历特点: 前序:根、左子树、右子树 中序:左子树、根、右子树 所以,当给定前序中序的遍历结果,如: (前序)preorder...rootIndex - 0 = rootIndex, 所以也能通过前序遍历的结果知道前序左 / 右子树内容,假如拷贝一份的话,左子树右子树前序遍历为: 5、然后通过递归,继续构造左 / 右子树就可以完成树的构建...(preorder[0]); } /** * 超过1个节点,递归调用构建 */ return this.buildByRecur(preorder, 0,...另外,本文是通过前序中序来实现二叉树的重构,如果遇到后序列中序来重建二叉树,也是一样的思考方式。只不过后序的跟节点是最后一个。

    20110

    通过前序+中序后序+中序来构建二叉树

    在这里插入图片描述 前序 + 中序 题意:给你一个前序遍历中序遍历,你要构造出一个二叉树。...示例: 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 要想解决这类题目,我们就要掌握遍历的特点。...我们能找到根节点,就能找到左子树右子树的集合,那么这个二叉树是不是就已经有了一个大致的样子。 接下来要做的,就是使用递归去构建出左子树右子树。 示例过程: ? 1 ? 2 ?...找到根结点(后序遍历的最后一位) 在中序遍历中,找到根结点的位置,划分左右子树,递归构建二叉树。 这里希望各位自行在草稿纸上画一下,二叉树构建过程。...二叉树的问题绝大部分都是三种遍历有关,思考问题的时候,可以三种遍历的特点入手。

    2.4K30

    【算法题解】 Day30 搜索与回溯

    二叉树中和为某一值的路径 难度:medium 给你二叉树的根节点 root 一个整数目标 targetSum ,找出所有 根节点到叶子节点 路径总和等于给定目标的路径。...重建二叉树 题目 剑指 Offer 07. 重建二叉树 难度:medium 输入某二叉树的前序遍历中序遍历的结果,请构建二叉树并返回其根节点。...这样以来,我们就知道了左子树的前序遍历中序遍历结果,以及右子树的前序遍历中序遍历结果,我们就可以递归地对构造出左子树右子树,再将这两颗子树接到根节点的左右位置。..., inorder_left, inorder_root - 1) # 递归地构造右子树,并连接到根节点 # 先序遍历中「 左边界+1+左子树节点数目...」的元素就对应了中序遍历中「 根节点定位+1 到 右边界」的元素 root.right = myBuildTree(preorder, inorder, preorder_left +

    11920

    每日一题:LeetCode-105.从前序遍历与中序遍历构造二叉树

    ✈️✈️ LeetCode-105.从前序与中序遍历序列构成二叉树: 题目: 给定两个整数数组 preorder inorder ,其中 preorder二叉树的先序遍历inorder 是同一棵树的中序遍历...inorder[i] <= 3000 preorder inorder 均 无重复 元素 inorder 均出现在 preorder preorder 保证 为二叉树的前序遍历序列 inorder...保证 为二叉树的中序遍历序列 解法: 思路:   我们在学习二叉树的时候,很早就会了使用前序中序或者中序后序的序列来还原一颗二叉树。...接着向左子树右子树分别重复上述操作,就可以递归构建一颗二叉树、 1、我们把前序遍历数组的左右子树给找出来,所以需要中序遍历的结果来,用pos作为下标,只要中序遍历数组的值不等于前序遍历数组的第一个值...right = buildTree(preArr, inArr); return root; } };   这是一道力扣的中等题,总的来说也并不算很难,理解掌握对前序遍历与中序遍历递归构建的过程才是最重要的

    10810

    构建二叉树

    从中序与后序构建二叉树 给定两个整数数组 inorder postorder ,其中 inorder二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。...不为空则向下继续,为空返回null 去后序数组中的最后一个元素为树的头节点的val值,(原因由后序遍历可知) 切割中序数组 ,以头节点的val值为区分(作为切割点) ,切割成中序左数组 中序右数组...思路 与从中序后序构建二叉树相同 代码实现 class Solution { Map map; // 方便根据数值查找位置 public TreeNode.../** * 通过中序数组 and 后序数组 构建一颗二叉树 * @param inorder 中序数组 * @param postorder 后序数组 * @return */ Node*...buildTree(leftIn, leftPost); root->right = buildTree(rightIn , rightPost); return root; } 从前序与中序构建二叉树

    6410

    ——二叉树链式结构的实现

    概念中可以看出,二叉树定义是递归式的,因此后序基本操作中基本都是按照该概念实现的。 2. 二叉树遍历 1. 前序、中序以及后序遍历 学习二叉树结构,最简单的方式就是遍历。...NLR、LNRLRN分别又称为先根遍历、中根遍历后根遍历。...// 二叉树前序遍历 void PreOrder(TreeNode* root); // 二叉树中序遍历 void InOrder(TreeNode* root); // 二叉树后序遍历 void PostOrder...("%d ", root->data); PreOrder(root->left); PreOrder(root->right); } 2.中序遍历递归 InOrder函数实现了二叉树的中序遍历。...// 二叉树前序遍历 void PreOrder(TreeNode* root); // 二叉树中序遍历 void InOrder(TreeNode* root); // 二叉树后序遍历 void PostOrder

    7710

    剑指Offer题解 - Day44

    重建二叉树 力扣题目链接[1] 输入某二叉树的前序遍历中序遍历的结果,请构建二叉树并返回其根节点。 假设输入的前序遍历中序遍历的结果中都不含重复的数字。...Input: preorder = [-1], inorder = [-1] Output: [-1] 限制: 0 <= 节点个数 <= 5000 思路: 本题是通过先序遍历中序遍历的结果来倒推二叉树的结构...知道了左子树的数量右子树的数量,此时就可以将前序遍历的数组分为[根节点|左子树|右子树] 也就是说,「中序遍历是为了明确在前序遍历如何分割左子树右子树」。...= (preorder, inorder) => { let map = new Map(); // 初始化哈希表,存储中序遍历的值与索引对应关系 for (let i = 0; i...本题也比较复杂,需要多思考如何通过前序中序遍历构建二叉树

    16120
    领券