题目:
给定二叉搜索树的前序遍历
求出二叉搜索树
题解:
前序遍历是:根 - 左子树 - 右子树
——所以很容易得出根节点
右因为二叉搜索树的性质,左子树 < 根节点
——所以,如果前序遍历的根节点后面跟随一个更小的值,那直接挂在左边。
问题出现了,如果跟随了一个更大的值,应该挂在哪个级别的右子树?
——使用栈存储右子树为空的节点,依次向栈的深处进行比较,直到栈取空或遇到栈内元素更大
代码:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
import collections
class Solution:
def bstFromPreorder(self, preorder: list[int]) -> TreeNode:
stack = collections.deque()
root = TreeNode(preorder[0])
stack.append((root.val, root)) # 如果右子树是空的,就存栈
for i, v in enumerate(preorder):
if i == 0: continue
n = TreeNode(v)
if v < stack[-1][0]:
stack[-1][1].left = n
else:
parent = stack.pop()[1]
while stack:
if v > stack[-1][0]:
parent = stack.pop()[1]
else:
break
parent.right = n
stack.append((v, n))
return root