题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
样例:
输入:[4,8,6,12,16,14,10]
输出:True
思路
关于二叉搜索树及后序遍历的一些性质:
1、在搜索二叉树中,小于父节点的键都在左子树中,大于父节点的键都在右子树中(二叉搜索性)。也即是说,对于任意一棵二叉搜索树,任意左子树的节点值都小于根节点的值,任意右子树的节点值都大于根节点的值。
2、二叉搜索树的子树仍为二叉搜索树,具有二叉搜索性。
3、后序遍历的顺序为:左->右->根
基于上面的三个性质,我们应该想到,
1、此题中输入列表的最后一个元素为该二叉树的根节点(假设该数组是二叉搜索树的后序遍历结果),2、从第一个元素往后遍历,第一个大于根节点的元素即为该二叉树右子树的第一个元素,该元素之前为该二叉树的左子树。
3、遍历右子树,若其中某一元素小于根节点则程序返回False
4、由于二叉搜索树的子树仍为二叉搜索树,所以利用递归分别判断左右子树是否仍为二叉搜索树
代码实现
class Solution:
def verifySequenceOfBST(self, sequence):
"""
:type sequence: List[int]
:rtype: bool
"""
if not sequence:
return True
root = sequence[-1]
n = len(sequence)
for i in range(n):
if sequence[i] > root: # 找到第一个大于根节点的元素
break
for j in range(i, n-1): # 遍历右子树
if sequence[j] < root:
return False
left = True
if i > 0:
left = self.verifySequenceOfBST(sequence[:i]) # 递归判断左子树
right = True
if i < n-1:
right = self.verifySequenceOfBST(sequence[i:-1]) # 递归判断右子树
return left and right