您的位置:首页 > 编程语言 > Python开发

《苦练算法》-剑指Offer- 二十三、二叉搜索树的后序遍历序列 -python编写

2018-02-07 22:17 423 查看
题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

题目补充

1. 二叉搜索树

取自百度百科说的很清楚

总结的讲 就是这个树 的每个节点的左节点都要比这个节点小,每个节点的有节点都要比这个节点大。叫做搜索树的原因在于,这种结构下,通过判断每个节点与要搜索的数字进行对比可以很快的搜索到

具体操作可以见这篇很生动的文章

2.后序遍历,即根节点在最后的遍历方式,即为: 左右根的遍历方式。

题目分析

本题明显考的又是递归或是循环

1.递归的话就是,每次把根节点拿出来,之后从后往前循环到比根大的位置说明此时应该到了左子树的位置,之后把左子树和右子树全都分离出来,此时已经默认右子树ok的,那就循环左子树看是否满足所有元素都小于根的值,如果ok的话,之后继续递归左子树如上述判断方式,右子树亦然,递归停止条件就是开始节点的index大于等于标记根节点的index

具体代码如下:

# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if len(sequence) == 0:
return False
if len(sequence) == 1:
return True
return self.isLastOrder(sequence,0,(len(sequence)-1))
def isLastOrder(self,s,start,root):
if start >= root:
return True
i = root
while i > start and s[i-1]>s[root]:
i = i - 1
for j in range(start,i-1):
if s[j] > s[root]:
return False
return self.isLastOrder(s,start,i-1) and self.isLastOrder(s,i,root-1)


2.循环思路和递归差不多,也就是代码表现形式不太一样

# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
l = len(sequence)
if l == 0:
return False
if l == 1:
return True
i = 0
l = l-1
while(l):
while sequence[i]<sequence[l]:
i = i + 1
while sequence[i]>sequence[l]:
i = i + 1
if i != l:
return False
i = 0
l = l-1
return True
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: