4月30天leetcode训练-Day20

本文介绍如何根据给定的先序遍历构建二分搜索树,详细解析了先序遍历和二分搜索树的概念,提供了一个简单有效的Python实现。

Day20-Construct Binary Search Tree from Preorder Traversal

题外话:由于时差的关系,leetcode这个四月挑战上午的日期和下午的日期公布的时间不一样。导致我的答题日期编号好像乱了。。其实最主要的原因是我没有每天坚持答题。。。自己搞乱了。。哈哈哈哈哈。。以后再整理吧(拖延症晚期了)

题目描述:

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.)

就是给了一个先序遍历,然后建立基于该先序遍历的二分搜索树。

解法:

这题还是蛮简单的吧。搞明白两个概念问题就解决了。先序遍历:先是根节点,然后左子树,最后右子树。二分搜素树:左子树的值小于根节点的值,右子树的值大于根节点的值。

这就完事了吧,遍历先序数组,第一个值肯定是根节点,然后往后找第一个大于根节点的值,在这个值和根节点之间的数就是左子树中的数,这个值后面的数就是右子树的数,通过递归就建立起来了。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def bstFromPreorder(self, preorder: List[int]) -> TreeNode:
        if len(preorder) == 0:
            return None
        #因为先序遍历所以第一个元素一定为跟节点。
        root = TreeNode(preorder[0])
        #先序遍历先访问根节点然后左子树,然后右子树,同时左子树的节点一定比根节点的数小,右子树的节点一定比根节点的数大。所以向后寻找第一个比根节点大的数字就是右子树的根节点。然后递归求解左右子树即可
        i = 1
        while i < len(preorder):
            if preorder[i] > root.val:
                break
            i += 1
        root.left = self.bstFromPreorder(preorder[1:i])
        root.right = self.bstFromPreorder(preorder[i:])
        return root

时间复杂度为O(N*logN),空间复杂度为O(N).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值