方法一:递归分治:时间O( n 2 n^2 n2)、空间O(n)
解题思路:
- 利用后序遍历的特点:左树 | 右树 | 根结点,检查每个根的左右子树是否满足二叉搜索树特性
- 若当前根结点满足搜索树特性,则继续在该节点的左右子树中检查
题解:
- 递归分治法:定义一个根结点,遍历数组,直到节点值比根结点大。
- 记录当前的位置pos,继续向后遍历,后序节点应该满足都大于根结点。
- 分治:检查pos位置两边的树,也就是分成了左右树
class Solution {
public:
bool verifyPostorder(vector<int>& postorder)
{
// 1.后序遍历的规则:左支|右支|根节点
// 2.因此只要满足每颗树都满足二叉搜索树的特性,则说明该数组正确
// 3.利用分治思想将二叉树划分成一颗颗子树
// 4.缺点:每次检查都要遍历二叉树,且一遍只能检查完成一个节点的正确性,时间复杂度O(n^2)
return CheckTree(postorder, 0, postorder.