题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则返回true,否则返回false。
假设输入的数组的任意两个数字都互不相同。
数据范围
数组长度 [0,1000]。
示例:
输入:[4, 8, 6, 12, 16, 14, 10]
输出:true
首先理解二叉搜索树(二叉排序树)的性质:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点
借鉴:剑指offer-23.二叉搜索树的后序遍历序列-Python_vitA_gsm的博客-CSDN博客
后序遍历:left->right->root
[2,4,3,6,8,7,5]
过程:
1、根节点;
2、遍历剩下的序列,找到第一个大于root的index,则该index左边为左子树,右边为右子树;
3、遍历右子树,确保所有值都大于root的值,反之返回false;
4、将树分为左子树和右子树,重复以上步骤。
class solution(): # 第一次写的
def func0(self , seque):
if len(seque) == 0:
return False
elif len(seque) == 1:
return True
else:
return self.func1(seque)
def func1(self , seq):
if len(seq) <= 2:
print(seq)
return True
root = seq[-1]
index = 0
while seq[index] < root: #判断左子树
index += 1
while index < len(seq) -1:
if seq[index] > root: # 判断右子树
index += 1
else:
return False
left = seq[:index]
right = seq[index:]
return self.func1(left) and self.func1(right)
######################################################################
class Solution: # 第二次写的
def func(self , array_list):
if len(array_list) == 1:
return True
root = array_list.pop(-1)
index = None
for i in range(len(array_list)):
if array_list[i] > root:
index = i
left = array_list[:index]
right = array_list[index:]
break
else:
return False
if not index:
return False
else:
return self.func(left) and self.func(right)
a = [2,4,3,6,8,7,5]
f = solution()
res = f.func0(a)
print(res)