前言:
当一眼看不出问题中隐藏的规律时,我们可以试着用一两个具体的例子模拟操作的过程,说不定这样那就能通过具体的例子找到抽象的规律。
题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
深度优先遍历中的先序遍历、中序遍历、后序遍历,都是针对在遍历中根结点的位置来命名的,先序遍历,第一个元素是根结点,后序遍历,最后一个元素是根结点。
二叉搜索树中,在后序遍历得到的序列中,最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分:第一部分是左子树结点的值,他们都比根节点的值小;第二部分是右子树结点的值,他们都比根结点的值大。
递归循环都可以实现。
python 代码实现:(递归)# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if not sequence:
return False
if len(sequence) == 1:
return True
length=len(sequence)
# 获取根节点,后序遍历最后一个元素就是根节点
root=sequence[-1]
# 在二叉树搜索树中左子树的结点小于根节点
i=0
while sequence[i] < root:
i=i+1
# 在二叉搜索树中右子树的节点大于根节点
k=i
for j in range(i, length-1):
if sequence[j] < root:
return False
left_s = sequence[:k]
right_s = sequence[k:length-1]
# 判断左子树是不是二叉搜索树
leftIs = True
if len(left_s) > 0:
leftIs = self.VerifySquenceOfBST(left_s)
# 判断右子树是不是二叉搜索树
rightIs = True
if len(right_s) > 0:
rightIs = self.VerifySquenceOfBST(right_s)
return leftIs and rightIs
循环
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if not sequence:
return False
if len(sequence)==1:
return True
i = 0
length=len(sequence)
while length:
length -= 1
while sequence[i] < sequence[length]:
i += 1
while sequence[i] > sequence[length]:
i += 1
if i < length:
return False
i = 0
return True