可以看出,任何一个内部节点的取值,其左节点取值必定小于该节点取值,其右节点取值必定大于该节点取值。
接下来,我们看题:
后序遍历,即左右根,那么序列的最后一个数据必定是根节点值,那么再结合是二叉搜索树,那么除根节点外的剩余数据,必定一部分是小于根节点值,另一部分是大于根节点值。
举个例子看的更清楚点:
{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