• 剑指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)
  • 相关阅读:
    通过Javascript调用微软认知服务情感检测接口的两种实现方式
    Microsoft Flow 概览
    使用PowerApps快速构建基于主题的轻业务应用 —— 进阶篇
    从三个语言(C++,Java,C#)的几个性能测试案例来看性能优化
    自己动手,打造轻量级VSCode/C#环境代替LinqPad
    2015年总结
    将知识变成你的技能点
    瞎子摸象与刻舟求剑
    俺的追求,下一个五年的指导纲领
    工作中任务管理的四个原则和四个技能
  • 原文地址:https://www.cnblogs.com/missidiot/p/10677433.html
Copyright © 2020-2023  润新知