题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \
2 6
/ \
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
提示:
数组长度 <= 1000
解题思路
二叉搜索树的特点是左节点比根节点小,右节点比根节点大。
二叉搜索树的后序遍历结果为左节点|右节点|根节点。
据此,编写函数,从尾到头检测,如果大于最后一位的放入right数组,如果小于最后一位的放入left数组,如果左右数组都检测完了,还有剩余则是错误结果。
左节点有内容就进行递归,同理右节点。
从尾到头处理数组需要注意,获取到的数组是一位一位进行追加的,那么就破坏了原有的数组顺序,我重新编写了函数进行倒序。
时间复杂度O(n)
空间复杂度O(3^n),之所以这么写是因为,每次都创建root,并且在最坏的情况下,root,left,right都需要创建,所以这样分析
提交结果
package main
import "fmt"
func main() {
a := []int{1, 6, 3, 2, 5}
fmt.Println(verifyPostorder(a))
}
func verifyPostorder(postorder []int) bool {
var root int
var left, right []int
if len(postorder) >= 1 {
root = postorder[len(postorder)-1]
postorder = postorder[:len(postorder)-1]
for len(postorder) != 0 && postorder[len(postorder)-1] > root {
right = append(right, postorder[len(postorder)-1])
postorder = postorder[:len(postorder)-1]
}
right = dx(right)
for len(postorder) != 0 && postorder[len(postorder)-1] < root {
left = append(left, postorder[len(postorder)-1])
postorder = postorder[:len(postorder)-1]
}
left = dx(left)
if len(postorder) != 0 || verifyPostorder(right) != true || verifyPostorder(left) != true {
return false
}
}
return true
}
func dx(nums []int) []int {
var x []int
for len(nums) != 0 {
x = append(x, nums[len(nums)-1])
nums = nums[:len(nums)-1]
}
return x
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。