1008. Construct Binary Search Tree from Preorder Traversal(根据先序遍历构建BST)

题目描述

Return the root node of a binary search tree that matches the given preorder traversal.
(Recall that a binary search tree is a binary tree where for every node, any descendant of node.left has a value < node.val, and any descendant of node.right has a value > node.val. Also recall that a preorder traversal displays the value of the node first, then traverses node.left, then traverses node.right.)

在这里插入图片描述

方法思路

class Solution {
    //Runtime: 1 ms, faster than 81.14%
    //Memory Usage: 36.9 MB, less than 100.00%
    public TreeNode bstFromPreorder(int[] preorder) {
        if(preorder.length == 0)
            return null;
        return help_bstFP(preorder, 0, preorder.length - 1);
    }
    public TreeNode help_bstFP(int[] preorder, int start, int end){
        if(start > end) 
            return null;
        if(start == end) 
            return new TreeNode(preorder[start]);
        TreeNode root = new TreeNode(preorder[start]);
        int index = 0;
        for(int i = start; i <= end; i++){
            if(preorder[i] > root.val){
                index = i;
                break;
            }
        }
        //需要考虑到只有左子树的情况如[4,2]
        if(index == 0){
            root.left = help_bstFP(preorder, start + 1, end);
        }else{
            root.left = help_bstFP(preorder, start + 1, index - 1);
            root.right = help_bstFP(preorder, index, end);
        }
        return root;
    }
}
<think>好的,用户想了解如何用Python通过序遍历构建二叉树。我需要回忆一下相关的数据结构知识,尤其是二叉树的构建方法。序遍历的顺序是根节点、左子树、右子树,所以构建的时候需要按照这个顺序来处理节点。 首,用户提供的引用中有几个例子,比如引用[1]中提到了根据序和后序遍历构建二叉树的Python代码,这可能对理解如何仅用序遍历构建有帮助吗?不过这里的情况不同,因为用户的问题可能是指给定一个序序列,如何重建二叉树,但通常单独的序可能不够,除非是特定类型的二叉树,比如二叉搜索树(BST),如引用[3]提到的。因为BST有左小右大的特性,可以利用序序列来重建,而普通二叉树可能需要更多的信息,比如中序或其他结构。 用户的问题可能有两种情况:一种是给定序序列和其他信息(如中序或后序)来构建二叉树,另一种是仅用序输入,可能结合某种特定结构(如标记空节点)来构建。例如,引用[4]中的C代码是用序输入,并且用'#'表示空节点,这样就能唯一确定二叉树的结构。这在Python中也可以实现类似的方法。所以,我需要确定用户具体需要的是哪种情况。根据用户的问题描述,“通过序遍历构建二叉树”,可能指的是第二种情况,即输入包含空节点的标记,比如用None或特定符号(如'#')表示,这样可以通过递归的方法逐个节点构建。接下来,我需要参考现有的实现方法。例如,引用[4]中的C代码是边输入边创建节点,每次读取一个字符,如果是'#'则置空,否则创建节点,并递归创建左右子树。在Python中,可以将输入转换为一个列表,并用迭代器或指针来逐个取出元素,类似的方法。 例如,用户可能输入一个序序列,如[1,2,None,4,5,None,None,3,...],或者使用特定的占位符表示空节点。这时候,递归函数的逻辑是:当前元素是根,然后递归构建左子树和右子树。如果当前元素是None或标记,则返回None。因此,Python的实现可以是将输入序列转换为一个生成器或者使用索引来遍历,每次取一个元素作为当前节点的值,如果是空则返回None,否则创建节点,并递归构建左右子树。此外,用户提供的引用[1]中的代码虽然是根据前序和后序构建,但递归方法可能类似,其中分解左右子树的方式可能不同。但在这里,如果仅用前序且带有空节点标记的话,分解方式会更直接。 总结步骤:1.将输入的序序列转换为可逐个弹出的结构,比如队列或使用迭代器。 2.定义递归函数:弹出第一个元素,如果是空标记,返回None;否则创建节点。3.递归构建左子树和右子树。4.返回根节点。 需要注意处理输入的方式,比如用户如何提供带有空节点标记的序序列。例如,输入可能是类似[1,2,None,None,3,4,None,None,5,None,None],这样每个非空节点都有左右子树,即使为空也需要显式表示。这样才能正确构建树的结构。 然后,需要编写对应的Python代码,定义TreeNode类,递归函数construct_tree,处理输入列表。例如:classTreeNode:def__init__(self, val=0,left=None, right=None):self.val =valself.left =leftself.right =rightdef build_tree(preorder):defhelper(data_iter):val =next(data_iter)ifval isNone:returnNonenode= TreeNode(val)node.left =helper(data_iter)node.right =helper(data_iter)returnnodedata_iter =iter(preorder)returnhelper(data_iter)这样,当输入preorder列表时,比如[1,2,None,None,3,4,None,None,5,None,None],就能正确构建二叉树。但用户需要注意输入必须包含足够的None来表示空子树,否则会引发StopIteration错误。可能还需要解释输入格式的要求,比如必须严格按照序顺序,包括所有空子节点的位置。例如,如果某个节点没有左子节点,则必须在列表中显式地放置None,否则后续的节点会被错误地分配为右子树。 此外,可能还需要考虑其他构建方法,比如使用栈迭代的方式,但递归方法更为直观,尤其是对于序遍历的结构。最后,需要验证示例是否正确。例如,给定一个序列表,构建后的树结构是否符合预期。例如,输入[1,2,None,None,3,None,None],构建的树根为1,左子为2,右子为3,左右子节点均为叶子。总结,用户可能需要的是这种带有显式空节点标记的构建方法,这在Python中可以通过递归实现,逐个处理列表中的元素,遇到None则返回空节点。</think>### Python实现通过序遍历构建二叉树的方法 根据序遍历构建二叉树需要满足以下条件: 1. 输入序列需包含显式的空节点标记(例如`None`或特定符号) 2. 按照**根节点→左子树→右子树**的顺序递归处理节点 #### 实现步骤 1. **定义节点类** 2. **递归构建函数**:逐个读取序序列中的元素,创建节点并递归构建左右子树 3. **处理输入序列**:将输入转换为迭代器以支持顺序读取 #### 代码实现 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def build_tree(preorder): def helper(data_iter): val = next(data_iter, None) # 读取当前节点值 if val is None: # 空节点标记处理 return None node = TreeNode(val) # 创建根节点 node.left = helper(data_iter) # 递归构建左子树 node.right = helper(data_iter) # 递归构建右子树 return node data_iter = iter(preorder) # 转换为迭代器 return helper(data_iter) ``` #### 输入格式示例 输入列表需严格按序排列,空节点用`None`表示: ```python preorder = [1, 2, None, None, 3, 4, None, None, 5, None, None] ``` 对应二叉树结构: ``` 1 / \ 2 3 / \ 4 5 ``` #### 关键点说明 1. **递归终止条件**:遇到`None`时返回空子树 2. **迭代器作用**:保证每次读取顺序与序序列一致[^2] 3. **时间复杂度**:$O(n)$,每个节点仅处理一次 #### 验证方法 ```python # 序遍历验证函数 def preorder_traversal(root): return [root.val] + preorder_traversal(root.left) + preorder_traversal(root.right) if root else [None] # 测试用例 test_pre = [1, 2, None, None, 3, None, None] tree = build_tree(test_pre) print(preorder_traversal(tree)) # 输出应还原输入序列(末尾None会被保留) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值