#输入一个整数数组,判断该数组是否是某二叉搜索树的后序遍历结果#注:二叉搜素树的左子树结点小于根结点 右子树结点大于根结点#思路:可以先找到二叉树的根结点,在基于根结点把整颗树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,在递归处理这两个子序列defSequence(arr):iflen(arr)==0:returnFalse#后序遍历,最后一个数是根结点 ==>左-右-根
root = arr[-1]
length =len(arr)
index =0#从头开始遍历判断左子树for i inrange(length-1):
index = i
if arr[i]> root:break#判断右子树 从+1开始是因为默认在index时候值已经大于root了,肯定属于右子树了for i inrange(index+1,length-1):if arr[i]< root:returnFalse#递归验证左右子树是否都是二叉搜索树
left =Trueif index >0:
left = Sequence(arr[:index])
right =Trueif index < length-1:
right = Sequence(arr[index:length-1])return left and right
array =[7,4,6,5,9,11,10,8]print(Sequence(array))#相关:判断数组是否是前序遍历的结果defSequence1(arr):iflen(arr)==0:returnFalse#前序遍历,第一个是根结点 ==>根-左-右
root = arr[0]
length =len(arr)
index =1#从第二个元素开始遍历判断左子树for i inrange(index,length):
index = i
if arr[i]> root:break#判断右子树 从1开始是因为默认在index时候值已经大于root了,肯定属于右子树了for i inrange(index+1,length-1):if arr[i]< root:returnFalse#递归验证左右子树是否都是二叉搜索树
left =Trueif index >1:
left = Sequence1(arr[1:index])
right =Trueif index < length:
right = Sequence1(arr[index:length])return left and right
array1 =[8,4,7,3,5,9,11,10]print(Sequence1(array1))