剑指Offer_33_二叉搜索树的后续遍历序列

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。

参考以下这颗二叉搜索树:

     5
    / \
   2   6
  / \
 1   3

示例 1:

输入: [1,6,3,2,5]
输出: false

示例 2:

输入: [1,3,2,6,5]
输出: true

提示:

数组长度 <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-sou-suo-shu-de-hou-xu-bian-li-xu-lie-lcof

解题思路

后序遍历:先输出左子树和右子树,最后输出根节点
根据后续遍历根节点在最后的特点,可以直接获得根节点的值,根据左子树每个节点值比根节点小,右子树上每个节点值比根节点大的特点,找到数组中左子树和右子树的分割位置,分割位置在最左说明只有右子树,分割位置在最右说明只有左子树,如果有多个分割位置,说明不满足二叉搜索树的条件,返回false,将数组分成左子树和右子树之后,重新之前的步骤,直至只剩下一个节点或没有节点

代码

class Solution {
        public boolean verifyPostorder(int[] postorder) {
            return verifyPostorder2(postorder,0,postorder.length-1);
        }
        public boolean verifyPostorder2(int[] postorder,int start,int end){
            if(end-start<=1){
                return true;
            }
            int root = postorder[end];
            int pos = start;
            while(pos < end){
                if(postorder[pos]>root){
                    break;
                }
                pos++;
            }
            int dividPos = pos;
            while(pos<end){
                if(postorder[pos]<root){
                    return false;
                }
                pos++;
            }
            return verifyPostorder2(postorder,start,dividPos-1) && verifyPostorder2(postorder,dividPos,end-1);
        }
    }
posted @ 2021-10-08 09:34  codedogzlc  阅读(19)  评论(0编辑  收藏  举报