剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治
Posted hequnwang10
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治相关的知识,希望对你有一定的参考价值。
一、题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。
参考以下这颗二叉搜索树:
5
/ \\
2 6
/ \\
1 3
示例 1:
输入: [1,6,3,2,5]
输出: false
示例 2:
输入: [1,3,2,6,5]
输出: true
二、解题
递归分治
二叉搜索树的后序遍历:最后一个值是根节点,根节点的左子树的值是小于根节点的值,右子树是大于根节点的值,所以使用递归分治算法,从左往右找到第一个大于根节点的值,分割为左右两个子树。分割点为cur,[left,cur-1]小于根节点,[cur,right-1]大于根节点,只需要判断[cur,right-1]是否大于根节点。
class Solution
public boolean verifyPostorder(int[] postorder)
if(postorder == null)
return true;
return verifyTree(postorder,0,postorder.length-1);
//二叉搜索树 递归分治 找到第一个大于根节点的下标 分割为左右子树
public boolean verifyTree(int[] postorder,int left,int right)
if(left >= right)
return true;
//从左往右找第一个大于根节点的值
int cur = left;
while(postorder[cur] < postorder[right])
cur++;
//此时cur 下标就是分割点
//如果是正确的二叉搜索树的后序遍历,则[left,cur-1]小于根节点,[cur,right-1]大于根节点
//判断[cur,right-1]是否大于根节点
for(int i = cur;i<right;i++)
if(postorder[i] < postorder[right])
return false;
return verifyTree(postorder,left,cur-1) && verifyTree(postorder,cur,right-1);
时间复杂度:O(N^2)
空间复杂度:O(N)。
以上是关于剑指 Offer 33. 二叉搜索树的后序遍历序列-递归分治的主要内容,如果未能解决你的问题,请参考以下文章
剑指 Offer 33. 二叉搜索树的后序遍历序列(递归,二叉搜索树,后序遍历,Java)