LeetCode-剑指 Offer 33. 二叉搜索树的后序遍历序列

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

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

     5
    / \
   2   6
  / \
 1   3

示例 1:

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

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:二叉搜索树的后序遍历结果是左子树-右子树-根结点,所以利用p变量从左往右判断,确定第一个大于根结点的索引,赋值m,p继续前进,直到遇见第一个小于根结点的指针,每次p==j才可以满足后续遍历要求,然后一直递归,需要满足所有条件,使用逻辑符号and。
如果i >= j,说明此时只有一个结点,返回True就好

class Solution:
    def verifyPostorder(self, postorder: List[int]) -> bool:
        def cur(i, j):
            if i >= j: return True
            p = i
            while postorder[p] < postorder[j]: p+=1
            m = p
            while postorder[p] > postorder[j]: p+=1
            return p == j and cur(i, m-1) and cur(m, j-1)

        return cur(0, len(postorder)-1)
posted @ 2022-03-28 10:05  小Aer  阅读(2)  评论(0编辑  收藏  举报  来源