剑指offer07:重建二叉树

剑指offer07:重建二叉树

题目

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:


Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof

思路分析

这题其实不难,数据结构练过很多次了,但是问题是我不知道在leetcode的环境下python咋写递归,主要还是写的少不够熟练,多练练就就好了。

答案代码

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        def recur(root, left, right):
            if left > right: return                               # 递归终止
            node = TreeNode(preorder[root])                       # 建立根节点
            i = dic[preorder[root]]                               # 划分根节点、左子树、右子树
            node.left = recur(root + 1, left, i - 1)              # 开启左子树递归
            node.right = recur(i - left + root + 1, i + 1, right) # 开启右子树递归
            return node                                           # 回溯返回根节点

        dic, preorder = {}, preorder
        for i in range(len(inorder)):
            dic[inorder[i]] = i
        return recur(0, 0, len(inorder) - 1)

代码分析:

  • 写的非常简洁,并且使用了字典来降低时间复杂度
    for i in range(len(inorder)):
        dic[inorder[i]] = i
    
    这部分就是用一个字典直接索引到根节点的位置,不用在recur函数中用for循环在不断遍历
  • 关于如何在python递归:
    其实没啥不同的地方,直接在class中建立一个递归函数就行了,然后在类里面直接调用函数就完事了。
posted @ 2022-04-21 15:57  富士山上  阅读(29)  评论(0编辑  收藏  举报