知识点:栈、二叉搜索树
问题描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
二叉搜索树的特点:
对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。
结合图中分析:
一棵 BST :左孩子 < 根结点 < 右孩子
一棵 BST 的左子树或者右子树都是 BST
后序遍历是,左右根:[3, 4, 9, 5, 12, 11, 10]
结合图再从左往右分析后序序列,分析子树,可以发现:
[3, 4, 9, 5] 10 [12, 11]
[3, 4] 5 [9]
[3] 4
[12] 11
发现对于每一棵子树,它的根结点总是对应该子树的后序序列的最后一个数
那么,只需要不断地确定出左子树区间和右子树区间,并且判断:左子树区间的所有结点值 < 根结点值 < 右子树区间所有结点值,这个条件是否满足即可
具体代码实现:(递归法)
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
s=len(sequence)
index=0
if s==0:
return False
for i in range(s):
if sequence[i]>sequence[-1]:
index=i
break
for j in range(i,s):
if sequence[j]<sequence[-1]:
return False
left=True
right=True
if len(sequence[:index])>0:
left=self.VerifySquenceOfBST(sequence[:index])
if len(sequence[index:-1])>0:
right=self.VerifySquenceOfBST(sequence[index:-1])
return right and left
参考链接:
- https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd?answerType=1&f=discussion
- https://blog.csdn.net/qq_36936730/article/details/104668315