# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.7 如何判断一个数组是否是二元查找树后续遍历的序列
题目:
输入一个整数数组,判断该数组是否是某二元查找树的后续遍历的结果,如果是,那么
返回true,否则返回false。例如数组[1, 3, 2, 5, 7, 6, 4]就是下图中二叉树的后续遍历序列。
4
2 6
1 3 5 7
分析:
关键:
1 书上解法
二元查找树的特点: 某结点的左子树中任意结点的值小于该节点的值,
该节点的右子树中任意结点的值小于该节点的值。
2
后续遍历的结果数组的最后一个元素是根节点,然后从左向右,
第一个大于该根节点的元素及其后面的元素都是该节点的右子树;
第一个大于该根节点元素之前的元素都是该节点的左子树。
对右子树和左子树递归分析即可。
参考:
Python程序员面试算法宝典
'''
def isAfterOrder(data, begin, end):
if not data:
return True
if begin >= end:
return True
root = data[end]
i = begin
while i < end:
if data[i] > root:
break
i += 1
j = i
# 如果后面还找到小于根节点的元素,说明不符合要求
while j < end:
if data[j] < root:
return False
j += 1
leftFlag = isAfterOrder(data, begin, i - 1)
if not leftFlag:
return leftFlag
rightFlag = isAfterOrder(data, i, end - 1)
return rightFlag
def process():
data = [1, 3, 2, 5, 7, 6, 4]
result = isAfterOrder(data, 0, len(data) - 1)
assert result is True
data = [1, 3, 2, 8, 5, 7, 4]
result = isAfterOrder(data, 0, len(data) - 1)
assert result is False
data = [1, 3, 2, 4]
result = isAfterOrder(data, 0, len(data) - 1)
assert result is True
data = [5, 7, 6, 4]
result = isAfterOrder(data, 0, len(data) - 1)
assert result is True
if __name__ == "__main__":
process()
Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.7 如何判断一个数组是否是二元查找树后续遍历的序列
猜你喜欢
转载自blog.csdn.net/qingyuanluofeng/article/details/91638839
今日推荐
周排行