Leetcode 剑指 Offer 33. 二叉搜索树的后序遍历序列
题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
思路
- 二叉搜索树的性质就是 左 < 根 < 右, 后序遍历的形式就是 左 右 根, 所以二叉搜索树的后序遍历具有一个性质 —— 前半段的元素value < 最后一个元素, 中间半段的元素value > 最后一个元素
- 首先设置递归边界 —— 长度小于等于2不用说肯定返回True
- 递归体中 —— 找到第一个大于根值的元素, 从这个元素开始向后遍历看是不是都比根值大, 如果不满足则直接返回False
注:
第一个循环写if postorder[idx] >= rootval的原因是防止出现12345这样的递增序列, 如果写 > 的话, 就会一直递归下去出不了边界
代码 —— golang
func verifyPostorder(postorder []int) bool {
if len(postorder) <= 2 {
return true
}
size := len(postorder)
rootval, idx := postorder[size - 1], 0
for ;idx < size;idx++ {
if postorder[idx] >= rootval {
break
}
}
for i := idx;i < size;i++ {
if postorder[i] < rootval {
return false
}
}
return verifyPostorder(postorder[0:idx]) && verifyPostorder(postorder[idx:size - 1])
}