数据结构与算法15、剑指Offer9-二叉搜索树的后序遍历序列

在这里插入图片描述
可以看出,任何一个内部节点的取值,其左节点取值必定小于该节点取值,其右节点取值必定大于该节点取值。

接下来,我们看题:
在这里插入图片描述
后序遍历,即左右根,那么序列的最后一个数据必定是根节点值,那么再结合是二叉搜索树,那么除根节点外的剩余数据,必定一部分是小于根节点值,另一部分是大于根节点值。

举个例子看的更清楚点:
在这里插入图片描述
{5, 7, 6, 9, 11, 10, 8} 为其后序遍历,这很简单。
8是根节点,5 7 6都是左子树且均小于8,9 11 10均为右子树且均大于8。
我们再看左子树5 7 6中,6是根节点,左子树5小于6,右子树7大于6。
右子树9 11 10同理。
以此类推。

代码实现思路不难写,但是难点在于边界条件的考虑,我们在迅速写完主体逻辑代码后,就要考虑边界条件的情况,具体见代码注释:

# -*- coding:utf-8 -*-
class Solution:
    def VerifySquenceOfBST(self, sequence):
        # write code here
        if len(sequence) == 0:
            return False
        
        root = sequence[-1]
        length = len(sequence)
        for i in range(length):  # 如果i=length-1,说明全部为左子树,右子树不用递归
            if sequence[i] > root:
                break
        
        for j in range(i,length):  # 如果i=length-1,则此时取的是-1位置的数,不报错
            if sequence[j] < root:
                return False
        
        # 如果i=0,说明全部右子树,左子树不需要递归
        if i > 0:
            left = self.VerifySquenceOfBST(sequence[:i])
            if left is False:
                return False
        if i != length-1:
            right = self.VerifySquenceOfBST(sequence[i:length-1])
            if right is False:
                return False

        return True
发布了71 篇原创文章 · 获赞 20 · 访问量 4837

猜你喜欢

转载自blog.csdn.net/qq_22795223/article/details/105310954