阅读目录
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路及Python实现
- 什么是二叉搜索树?
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:
(1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)它的左、右子树也分别为二叉排序树。
- 回到题意,如果是后序遍历的结果,那说明数组最后一个的值必定是根root结点,而且后序遍历是按照:[左子树的值,右子树的值,root]排序的,根据BST的性质,左子树的值都要<root;右子树的值>root
- 做法:从数组左侧向右找,找到比root值大的位置,将左子树的值,右子树的值区分开,再用递归完成下一子规模查找
class Solution:
def VerifySquenceOfBST(self, sequence):
if sequence == []:
return False
root_val = sequence.pop()
# root_val = sequence[-1]
# del sequence[-1]
pos = None
for i in range(len(sequence)):
if pos == None and root_val < sequence[i]:
pos = i
if pos != None and root_val > sequence[i]:
return False
if sequence[:pos] == []:
left_ret = True
else:
left_ret = self.VerifySquenceOfBST(sequence[:pos])
if sequence[pos:] == []:
right_ret = True
else:
right_ret = self.VerifySquenceOfBST(sequence[pos:])
return left_ret and right_ret