二叉搜索树的后序遍历序列和前序遍历序列

#输入一个整数数组,判断该数组是否是某二叉搜索树的后序遍历结果
#注:二叉搜素树的左子树结点小于根结点  右子树结点大于根结点
#思路:可以先找到二叉树的根结点,在基于根结点把整颗树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,在递归处理这两个子序列
def Sequence(arr):
	if len(arr) == 0:
		return False
	#后序遍历,最后一个数是根结点  ==>左-右-根
	root = arr[-1]
	length = len(arr)
	index = 0
	#从头开始遍历判断左子树
	for i in range(length-1):
		index = i
		if arr[i] > root:
			break
	#判断右子树 从+1开始是因为默认在index时候值已经大于root了,肯定属于右子树了
	for i in range(index+1,length-1):
		if arr[i] < root:
			return False

	#递归验证左右子树是否都是二叉搜索树
	left = True
	if index > 0:
		left = Sequence(arr[:index])
	right = True
	if 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))

#相关:判断数组是否是前序遍历的结果
def Sequence1(arr):
	if len(arr) == 0:
		return False
	#前序遍历,第一个是根结点  ==>根-左-右
	root = arr[0]
	length = len(arr)
	index = 1
	#从第二个元素开始遍历判断左子树
	for i in range(index,length):
		index = i
		if arr[i] > root:
			break
	#判断右子树 从1开始是因为默认在index时候值已经大于root了,肯定属于右子树了
	for i in range(index+1,length-1):
		if arr[i] < root:
			return False

	#递归验证左右子树是否都是二叉搜索树
	left = True
	if index > 1:
		left = Sequence1(arr[1:index])
	right = True
	if index < length:
		right = Sequence1(arr[index:length])
	return left and right

array1 = [8, 4, 7, 3, 5, 9, 11, 10]
print(Sequence1(array1))

你可能感兴趣的:(二叉搜索树的后序遍历序列和前序遍历序列)