剑指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)
代码分析:
- 写的非常简洁,并且使用了字典来降低时间复杂度
这部分就是用一个字典直接索引到根节点的位置,不用在recur函数中用for循环在不断遍历for i in range(len(inorder)): dic[inorder[i]] = i
- 关于如何在python递归:
其实没啥不同的地方,直接在class中建立一个递归函数就行了,然后在类里面直接调用函数就完事了。