题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
來源:力扣(LeetCode)
解题思路
遍历概念
- 当输入的 List 值为空的时候,返回
True
- 后序遍历的顺序:小大中
- List 列表的最后一个数字为根节点( 小:左子; 大:右子; 中:根节点)
- 算法时间为 O(logN) ,依序判断将 List 序列分为左子树与右子树
- 仅需判断右子树序列的原因为:在前一步骤寻找左右子树的分节点时,已将小于 root 的值归为左子树。
- [Reminder] 递归解法很容易鬼打墙,真的迷路的时候,记得参考其他人的写法。 像这题鬼打墙很久。
- 写了子函数判断左、右子树的时候,条件限制变得越来越多。
- 以及一种想把 List 变成 Queue 的偏执。其实
queue.popleft()
在python当中等同于list.pop(0)
;queue.pop()
等同于list.pop()
。
二叉搜索树的定义
- 在二叉搜索树中:
- 若任意节点的左子树不为空,则左子树上所有节点的值均不大于它的根节点值。
- 若任意节点的右子树不为空,则右子树上所有节点的值均不小于它的根节点值。
- 任意节点的左、右子树也分别为二叉搜索树
Python代码
class Solution:
def verifyPostorder(self, postorder):
if not postorder:
return True
root = postorder.pop()
num = len(postorder)
i = 0
# 分成左子树跟右子树,左子树的值皆小于根节点
while i<num and postorder[i] < root:
i+=1
left = postorder[:i]
right = postorder[i:]
# 检查右子树的点是否皆大于根节点
for num in right:
if num < root:
return False
return self.verifyPostorder(left) and self.verifyPostorder(right)