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

191

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



