Python程序员面试算法宝典---解题总结: 第三章 二叉树 3.7 如何判断一个数组是否是二元查找树后续遍历的序列

# -*- 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()

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/91638839