题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)
输入输出示例
输入:[4,8,6,12,16,14,10]
返回值:true
解题思路
**二叉搜索树:**根节点的左子树上的所有节点值都比根节点的值小,右子树上所有节点的值都比根节点的值大;其次左子树和右子树也呈现这种趋势。如下是一个二叉搜索树。
- 首先从输入的序列sequence中找出根节点,因为是确定的是后序遍历序列(左-右-根的遍历方式),所以,根节点一定是序列的最后一个元素rootNum=sequence[-1];
- 由于二叉搜索树左分支比根节点小,右分支比根节点大的特点;序列中有连续的一部分的数一定都比序列中最后一个元素的值小(即为左子树),另一部分连续的数一定都比序列中最后一个元素的值大(右子树);
- 循环遍历序列中的值,如果index为空且找到第一个大于等于根节点的值rootNum,记录当前索引值;如果index不为空,且继续从index的值向下遍历,如果有比根节点的值小的数,则不满足条件,直接返回False;
- 分别递归遍历左子树和右子树
- 左子树与右子树的判别结果都为true时才返回true
代码示例
# coding:utf-8
'''
二叉搜索树的后续遍历
'''
class Solution:
def VerifySquenceOfBST(self, sequence):
# 为空是返回false
if sequence == []:
return False
# 由后序遍历确定根节点
rootNum = sequence[-1]
# 循环遍历序列中的数,找出第一个大于根节点的值所在的索引
index = None
for i in range(len(sequence)):
if sequence[i] > rootNum:
index = i
break
# 接着从上述索引开始遍历序列,确定该索引后的序列中是否有小于根节点的值,如果有,返回false
for j in range(index, len(sequence)):
if sequence[j] < rootNum:
return False
# 如果存在左子树和右子树,递归左子树和右子树的情况
# [1,2,3,4,6,7,8,9,5] 这里index为4
# 如果找到的索引值大于0,则表示存在左子树,
# 对左子树所在序列(即index之前的序列)进行递归
# [6,7,8,9,5] 这里index<0表示没有左子树,只有右子树
if index > 0:
left = self.VerifySquenceOfBST(sequence[:index])
# 如果找到的索引值小于序列的最后一个元素,则表示存在右子树,
# 对右子树所在序列(即index及之后的序列)进行递归
# [1,2,3,4,5] 这里index>len(sequence)-1表示没有右子树,只有左子树
if index < len(sequence)-1:
right = self.VerifySquenceOfBST(sequence[index:-1])
return left and right