题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
解题
用递归的方法,通过前序遍历确定根节点的值,在中序遍历中确定其位置从而划分左右子节点,分别用同样的方法构建左子树右子树,递归直至叶节点。其中为了加快在中序遍历中搜索根节点的位置,构建字典存储中序遍历。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: # 注意输出要求为TreeNode
self.dic = {} # 创建新字典
self.preorder = preorder
for i in range(len(inorder)):
self.dic[inorder[i]] = i # 将Inorder复制给字典,加速搜索
return self.rebuild(0, 0, len(inorder)-1) # 构建树
def rebuild(self, pre_root, lim_left, lim_right):
if lim_left > lim_right: # 递归结束条件:中序遍历为空
return
root = TreeNode(self.preorder[pre_root]) # 搜索当前树的根节点
i = self.dic.get(root.val) # 确定根节点在中序遍历中的位置,划分左右子树
root.left = self.rebuild(pre_root+1, lim_left, i-1) # 构建左子树
root.right = self.rebuild(pre_root+i-lim_left+1, i+1, lim_right) # 构建右子树
return root

时间复杂度 O(N) : N为树的节点数量。初始化 HashMap 需遍历 inorder ,占用 O(N) ;递归共建立 NNN 个节点,每层递归中的节点建立、搜索操作占用 O(1) ,因此递归占用 O(N) 。(最差情况为所有子树只有左节点,树退化为链表,此时递归深度 O(N) ;平均情况下递归深度 O(log2N))。
空间复杂度 O(N)) : HashMap 使用 O(N) 额外空间;递归操作中系统需使用O(N) 额外空间。
本文介绍了一种利用前序和中序遍历结果重建二叉树的递归算法,通过构建字典加速中序遍历中根节点的查找,实现高效重建。详细解析了算法流程与时间、空间复杂度。
172万+

被折叠的 条评论
为什么被折叠?



