牛客网 剑指offer 二叉搜索树的后序遍历序列 Python3

题目要求:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 

采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。

由题意可得:

1. 后序遍历序列的最后一个元素为二叉树的根节点;

2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。

算法步骤如下:

1. 找到根结点;

2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;

3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:

4. 分别递归判断左/右子序列是否为后序序列;

其中在判断start<=end的时候是都需要判断

 1)取到start==end时说明剩下的元素为1个,肯定是符合后序遍历,就直接返回true

 2)须判断start>end的情况,这种情况是没有左子树,只有根节点和一个右节点(只有两个元素)的情况,此时再递归左子树的时候,此时传入的end=start-1,此时的因为之前已经判断了右子树符合条件,此时就直接返回true

# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        def helper(sequence,start,root):
            if start>=root:
                return True
            rootval=sequence[root]
            ind=0
            for i in range(start,root):
                if sequence[i]>rootval:
                    for j in range(i,root):
                        if sequence[j]<rootval:
                            return False
                    break
            return helper(sequence,start,ind-1) and helper(sequence, ind, root-1)
            
        if sequence==[]:
            return False
        return helper(sequence,0,len(sequence)-1)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值