(python)小菜狗算法日记(二叉树系列)_剑指offer leetcode 面试题33. 二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

参考以下这颗二叉搜索树:

     5
    / \
   2   6
  / \
 1   3
示例 1:

输入: [1,6,3,2,5]
输出: false
示例 2:

输入: [1,3,2,6,5]
输出: true

提示:

数组长度 <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
根据二叉搜索树和后序遍历,最末尾的为根,小于根的为左子树,大于根的为右子树

递归终止条件,list为空。递归重复做的事,根据root=list[-1]重复把list分为左子树和右子树,判断左子树的每一个元素是否都小于root,右子树的每一个元素是否都小于root。返回值:返回检查左子树 and 右子树的判断。

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        if not postorder:
            return True
        root = postorder[-1]
        pos = 0
        for i in postorder[:-1]:
            if i>root:
                break
            pos+=1
        left = postorder[:pos]
        right = postorder[pos:-1]
        # for i in left: #判断pos时已经默认左边都小于root所以不用判断左边
        #     if i>root:
        #         return False
        for i in right:
            if i<root:
                return False
        return self.verifyPostorder(left) and self.verifyPostorder(right)

题目描述

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

剑指Offer上这道题有点不同,当sequence=[]时,返回False,leetcode返回True,所以多了一些小工序

# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        if not sequence:
            return False
        if len(sequence)==1:
            return True
        root = sequence[-1]
        pos = 0
        for i in sequence[:-1]:
            if i>root:
                break
            pos+=1
        left = sequence[:pos]
        right = sequence[pos:-1]
        for i in right:
            if i<root:
                return False
        lefts = True
        rights = True
        if len(left)>0:
            lefts = self.VerifySquenceOfBST(left)
        if len(right)>0:
            rights = self.VerifySquenceOfBST(right)
        return lefts and rights

第二次写的时候用了:

pos = 0
for i in sequence[:-1]:
    if i>root:
        pos =  sequence.index(i)
        break

 报错,想了一下测试用例,比如[3,5,7]其中根是7,而3,5都是左,这时没有右子树,找不到pos,用默认值0是不恰当的,而之前那个pos+=1可以解决这个问题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值