LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal解题报告(python)

本文介绍如何根据给定的先序和后序遍历构建二叉树的方法,详细解析了算法思路,通过递归方式实现,并提供了Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

889. Construct Binary Tree from Preorder and Postorder Traversal

  1. Construct Binary Tree from Preorder and Postorder Traversal python solution

题目描述

Return any binary tree that matches the given preorder and postorder traversals.
Values in the traversals pre and post are distinct positive integers.
在这里插入图片描述

解析

先序遍历的顺序是 根->左->右,而后序遍历的顺序是 左->右->根,如果要建立树,那么需从根结点开始创建,然后再创建左右子结点。由于先序和后序各自的特点,根结点的位置是固定的,既是先序遍历数组的第一个,又是后序遍历数组的最后一个。知道了根结点的位置后,我们需要分隔左右子树的区间,先序和后序的各个区间表示如下:

preorder -> [root] [left subtree] [right subtree]
postorder -> [left subtree] [right substree] [root]

具体到题目中的例子就是:
preorder -> [1] [2,4,5] [3,6,7]
postorder -> [4,5,2] [6,7,3] [root]
先序和后序中各自的左子树区间的长度肯定是相等的,但是其数字顺序可能是不同的,可以发现先序左子树区间的第一个数字2,在后序左右子树区间的最后一个位置,而且这个规律对右子树区间同样适用。
因为先序遍历的顺序是 根->左->右,而后序遍历的顺序是 左->右->根,其实这个2就是左子树的根结点,所以会一个在开头,一个在末尾了。我们就可以根据‘2’这个数字,来定位左右子树区间的位置范围。

class Solution:
    def constructFromPrePost(self, pre: List[int], post: List[int]) -> TreeNode:
        if not pre and not post:
            return None
        if pre[0]==post[0]:
            return TreeNode(pre[0])
        root = TreeNode(pre[0])
        i,j=1,0
        while pre[i]!=post[j]:
            j+=1
        root.left=self.constructFromPrePost(pre[1:j+2],post[0:j+1])
        root.right=self.constructFromPrePost(pre[j+2:],post[j+1:-1])
        return root

Reference

https://leetcode.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/discuss/238787/Python-recursive-O(N)-with-detailed-explanation-and-example

https://www.cnblogs.com/grandyang/p/10909191.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值