剑指offer 二叉搜索树的后序遍历序列

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

# -*- coding: utf-8 -*-
"""
Created on Tue Apr  9 10:12:31 2019

@author: Administrator
题目:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:
BST的中序遍历是有序的,后序(左友根)遍历时,最后的节点是根节点。
那么可以先找根节点,然后利用根节点的值,把数组分成两部分,前部分都比根节点小是左子树,
后部分都比根节点大是右子树。然后再分别遍历左右子树即可。
做这个题的时候利用从左遍历找到第一个比根节点的大的位置划分左右节点,
这样保证了左边部分都比根节点小,不能保证右边部分都比根节点大,所以对右边的部分进行了验证。
另外题目中有个坑,题目认为,空树不是BST……所以新定义了函数进行递归,否则会更简单点。
"""

# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        if not sequence:    #若数组为空,则直接返回
            return False
        return self.VerifyBST(sequence) 
    def VerifyBST(self,sequence):
        if not sequence:    #当只分割为空的时候,说明全部符合,返回为真
            return True
        root = sequence.pop()   #最后一个节点就是根节点
        index = self.FindIndex(sequence,root)   #找到大于根节点的那个位置就是右节点的区域位置
        if self.VerifyRight(sequence[index:],root): 
            left = sequence[:index]     #递归分左边区域
            right = sequence[index:]    #递归分为右边区域
            return self.VerifyBST(left) and self.VerifyBST(right)   #and只有全部左右都符合才返回真
        return False
    def VerifyRight(self,sequence,target):
        if not sequence:
            return True
        return min(sequence) > target
    def FindIndex(self,sequence,target):
        for i ,num in enumerate(sequence):
            if num > target:
                return i
        return len(sequence)
    
if __name__ == '__main__':
    solution = Solution()
    sequence = [4,8,6,12,16,14,10]
    res = solution.VerifySquenceOfBST(sequence)
    print(res)
posted @ 2019-04-09 15:53  weilongyitian  阅读(157)  评论(0编辑  收藏  举报