题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
递归解法
树的后序遍历方式是左右根,比如对于遍历序列
[4,8,6,12,16,14,10]
那么就可以知道10就是根节点,前面的左子树和右子树需要进一步判断。
二叉平衡树的条件是左子树全部小于根结点,右子树全部大于根节点。对于上述序列,首先找到根节点10,然后从头开始遍历,找到第一个大于10的下标,然后从下标开始到最后的切片序列应该全部大于10,如果一个不满足,就返回False,然后递归对两边子树做相同的操作。
class Solution: def VerifySquenceOfBST(self, sequence): if not sequence: return False root = sequence[-1] i = 0 while i < len(sequence) - 1: if sequence[i] > root: break i += 1 for j in range(i, len(sequence) - 1): if sequence[j] < root: return False #由于函数中只有返回False的条件判断,因此首先得将left和right都赋值为True,不然后面不管任何条件全是False left = True; right = True if i > 0: left = self.VerifySquenceOfBST(sequence[:i]) if i < len(sequence) - 1: right = self.VerifySquenceOfBST(sequence[i: len(sequence) - 1]) return left and right S = Solution() print(S.VerifySquenceOfBST([4,8,6,12,16,14,10]))