首页 > 编程语言 >算法编程 dfs 从先序和中序遍历还原二叉树

算法编程 dfs 从先序和中序遍历还原二叉树

时间:2023-01-21 21:55:07浏览次数:67  
标签:preorder 遍历 val 中序 dfs 二叉树 inorder

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

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

 

示例 1:

输入: 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 保证 为二叉树的中序遍历序列

 

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
        inorder_map = {val:i for i,val in enumerate(inorder)}
        n = len(preorder)
        nth = 0

        def dfs(start, end):
            nonlocal nth
            if start > end:
                return None

            val = preorder[nth]
            i = inorder_map[val] 

            root = TreeNode(val)
            if start <= i-1:
                nth += 1
                root.left = dfs(start, i-1)                            
            if i+1 <= end:
                nth += 1                        
                root.right = dfs(i+1, end)

            return root
        
        return dfs(0, n-1)

 

标签:preorder,遍历,val,中序,dfs,二叉树,inorder
From: https://www.cnblogs.com/bonelee/p/17064057.html

相关文章

  • 刷刷刷 Day 16 | 111. 二叉树的最小深度
    111.二叉树的最小深度LeetCode题目要求给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点......
  • 刷刷刷 Day 16 | 104. 二叉树的最大深度
    104.二叉树的最大深度LeetCode题目要求给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节......
  • 刷刷刷 Day | 101. 对称二叉树
    101.对称二叉树LeetCode题目要求给你一个二叉树的根节点root,检查它是否轴对称。示例输入:root=[1,2,2,3,4,4,3]输出:true解题思路通过分别遍历左右两个子树......
  • 刷刷刷 Day 15| 226. 翻转二叉树
    226.翻转二叉树LeetCode题目要求给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点示例输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]解题思路基本......
  • 刷刷刷 Day15 | 102. 二叉树的层序遍历
    102.二叉树的层序遍历LeetCode题目要求给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例输入:root=[3,9,20,null,null,1......
  • 刷刷刷 Day 14| 二叉树的遍历
    144.二叉树的前序遍历LeetCode题目要求给你二叉树的根节点root,返回它节点值的前序遍历。示例输入:root=[1,null,2,3]输出:[1,2,3]解题思路最重要的要明白......
  • 树,森林与二叉树的转换复习
    普通的树,结构太多,研究起来也很复杂。但是依据树的孩子兄弟表示法,可以将普通的树,转换为二叉树,就方便很多。转换步骤:1,加线:在所有兄弟之间连线2,去线:对树中每个结点,只保留它......
  • 线索二叉树
    线索二叉树的实现内涵,一棵n个结点的树中一定会存在n+1个空指针域,将此指针域给利用起来,实现指向前驱或后继。其线索二叉树,等于把一颗二叉树转化为一个双向链表。对二叉树......
  • 二叉树的最大宽度--google面试遇到过,他是要求求解所有路径path
    543.二叉树的直径难度简单1221收藏分享切换为英文接收动态反馈给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。......
  • 【DFS】LeetCode 951. 翻转等价二叉树
    题目链接951.翻转等价二叉树思路如果二叉树root1,root2根节点值相等,那么只需要检查他们的孩子是不是相等就可以了。如果root1或者root2是null,那么只有在他们都......