剑指offer二叉搜索树的后序遍历python
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路
后序遍历即先左右子,再根节点。所以我们可以先判断数组的最后一个元素是不是等于root,接下来要做的事情就是在数组中划分左右子。把左子数组和右子数组分别重复刚才的过程即可。
因为是二叉搜索树,根节点的左子都会小于根节点的值,所以将数组从前向后扫, 判断是不是存在一个临界点,临界点前面的数字全部小于根节点,临界点后面的数字全部大于根节点。然后将分段的子数组重新重复判断过程。
代码
# -*- coding:utf-8 -*- class Solution: def VerifySquenceOfBST(self, sequence): if not sequence: return False root = sequence[-1] split = len(sequence) - 1 for i in range(0,len(sequence) - 1): if sequence[i] >= root: split = i break #找到第一个大于等于root的 for i in range(split, len(sequence) - 1): if sequence[i] < root: #? return False left = True if split > 0: left = self.VerifySquenceOfBST(sequence[0:split]) right = True if split < len(sequence) - 1: right = self.VerifySquenceOfBST(sequence[split:len(sequence) - 1]) return left and right