剑指offer-python:31.二叉搜索树的后序遍历序列

题目:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。

如果是则返回true,否则返回false。

假设输入的数组的任意两个数字都互不相同。

数据范围

数组长度 [0,1000]。

示例:

输入:[4, 8, 6, 12, 16, 14, 10]

输出:true

首先理解二叉搜索树(二叉排序树)的性质:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点

剑指offer-python:31.二叉搜索树的后序遍历序列_第1张图片

借鉴:剑指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、将树分为左子树和右子树,重复以上步骤。

剑指offer-python:31.二叉搜索树的后序遍历序列_第2张图片

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)

你可能感兴趣的:(deep,learning,python,算法)