第2章 面试需要的基础知识
第3章 高质量的代码
第4章 解决面试题的思路
面试题27 :二叉树的镜像
面试题29 :顺时针打印矩阵
面试题30 :包含min函数的栈
面试题31:栈的压入、弹出序列
面试题32:上往下打印二叉树
面试题33: 二叉搜索树的后序遍历序列
第5章 优化时间和空间效率
第6章 面试中的各项能力
第7章 两个面试案例
题目描述
牛客网
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
解题思路
牛客网
结合上图分析:
一棵 BST :左孩子 < 根结点 < 右孩子
一棵 BST 的左子树或者右子树都是 BST
后序遍历是:[3, 4, 9, 5, 12, 11, 10],结合图再从左往右分析后序序列,分析子树,可以发现:它的根结点总是对应该子树的后序序列的最后一个数。那么,只需要不断地确定出左子树区间和右子树区间,并且判断:左子树区间的所有结点值 < 根结点值 < 右子树区间所有结点值,这个条件是否满足即可。
实战
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if not sequence:
return False
def core(seq):
if not seq or len(seq) == 1:
return True
root = seq.pop()
split = len(seq)
for i in range(len(seq)):
if seq[i] > root:
split = i
break
left, right = seq[:split], seq[split:]
for num in right:
if num < root:
return False
return core(left) and core(right)
return core(sequence)