输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
提示:
数组长度 <= 1000
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
根据二叉搜索树和后序遍历,最末尾的为根,小于根的为左子树,大于根的为右子树
递归终止条件,list为空。递归重复做的事,根据root=list[-1]重复把list分为左子树和右子树,判断左子树的每一个元素是否都小于root,右子树的每一个元素是否都小于root。返回值:返回检查左子树 and 右子树的判断。
class Solution:
def verifyPostorder(self, postorder: List[int]) -> bool:
if not postorder:
return True
root = postorder[-1]
pos = 0
for i in postorder[:-1]:
if i>root:
break
pos+=1
left = postorder[:pos]
right = postorder[pos:-1]
# for i in left: #判断pos时已经默认左边都小于root所以不用判断左边
# if i>root:
# return False
for i in right:
if i<root:
return False
return self.verifyPostorder(left) and self.verifyPostorder(right)
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
剑指Offer上这道题有点不同,当sequence=[]时,返回False,leetcode返回True,所以多了一些小工序
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if not sequence:
return False
if len(sequence)==1:
return True
root = sequence[-1]
pos = 0
for i in sequence[:-1]:
if i>root:
break
pos+=1
left = sequence[:pos]
right = sequence[pos:-1]
for i in right:
if i<root:
return False
lefts = True
rights = True
if len(left)>0:
lefts = self.VerifySquenceOfBST(left)
if len(right)>0:
rights = self.VerifySquenceOfBST(right)
return lefts and rights
第二次写的时候用了:
pos = 0
for i in sequence[:-1]:
if i>root:
pos = sequence.index(i)
break
报错,想了一下测试用例,比如[3,5,7]其中根是7,而3,5都是左,这时没有右子树,找不到pos,用默认值0是不恰当的,而之前那个pos+=1可以解决这个问题