思路
首先题目是对二叉搜索树的后序遍历,在解题之前我们应该明确什么是二叉搜索树、后序遍历,有哪些特点:
关于二叉查找树以下来自百度百科:
”二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。“,下图是个例子:
后序遍历是什么呢,就是每次遍历都将父节点最后一个遍历,即先它的左孩子,再右孩子,最后这个父节点,上图按照后序遍历的结果为2,9,5,16,17,15,19,18,12
经过以上分析我们可以知道后序遍历二叉搜索树得到的结果应该满足如下几点:
1.后序遍历得到的序列的最后一个值即为根节点
2.二叉搜索树的左孩子构成的序列的全部值必定都小于根节点的值,所以可以从头遍历这个序列当出现某个值大于根节点时表明该值往后到倒数第二个值应该都为右子树
3.每个左子树,右子树又都要递归的满足以上两点
实现
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if sequence == []:
return False
length = len(sequence)
root = sequence[-1]
for i in range(length):
if sequence[i] > root:
break
for j in range(i, length):
if sequence[j] < root:
return False
left = True
if i > 0:
left = self.VerifySquenceOfBST(sequence[:i])
right = True
if j < length - 1:
right = self.VerifySquenceOfBST(sequence[i:length-1])
return left and right