题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回true
,否则返回false
。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
1 | 5 |
示例1:
1 | 输入: [1,6,3,2,5] |
示例2:
1 | 输入: [1,3,2,6,5] |
提示:数组长度 <= 1000
思路
- 通过递归判断所有子树的正确性(后序遍历是否满足二叉搜索树的定义)
- 递归解析:
- 终止条件:当
i>=j
,说明此子树节点数量<=1
,直接返回true
- 递归流程:
- 划分左右子树:遍历后序遍历的
[i,j]
区间元素,寻找第一个大于根节点的节点,索引记为m
。左子树区间为[i,m-1]
,右子树区间为[m,j-1]
,根节点索引为j
。 - 判断是否为二叉搜索树:左子树区间
[i,m-1]
内元素都要<postorder[j]
。在1.
划分左右子树区间时已经保证左子树区间的正确性,因此只需判断右子树区间即可。右子树区间[m,j-1]
内元素都要>postorder[j]
。当遇到<=postorder[j]
的元素则跳出,通过p==j
判断是否为二叉搜索树。 - 返回值:
p==j
:判断此树是否正确recur(i,m-1)
:判断此树的左子树是否正确recur(m,j-1)
:判断此树的右子树是否正确
- 划分左右子树:遍历后序遍历的
- 终止条件:当
代码
1 | class Solution{ |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。