代码改变世界

剑指offer面试题24-二叉搜索树的后序遍历序列

2017-06-29 10:25  tlnshuju  阅读(135)  评论(0编辑  收藏  举报

题目:

/*
 * 输入一个整数数组,推断该数组是不是某二叉搜索树的兴许遍历的结果。<br/>
 * 假设是则返回true,否则返回false。<br/>
 * 如果输入的数组的随意两个数组都互不同样
 * */


既然是后序遍历,那么根元素肯定是在最后一个。

又应该为二叉搜索树,所以左边一半的肯定比根要小,右边一半的比根要大。

如今有了根,就能够把剩下的数组依据比根小与比根大的切割线分成两半。

然后再递归推断。


什么时候返回false:

当确定了某个切割点以后,(左边的全比根小。右边的第一个比根大)又在右边的数组中找到一个比根小的,说明该数组不满足二叉搜索树的后序遍历。


package com.aii.algorithm;

/**
 * 输入一个整数数组,推断该数组是不是某二叉搜索树的兴许遍历的结果。

<br/> * 假设是则返回true,否则返回false。<br/> * 假设输入的数组的随意两个数组都互不同样 * */ public class VerifySquenceOfBST { public boolean check(int[] array, int start, int end) { if (end >= 0 && end - start <= 1) { return true; } int root = array[end]; int newRootIndex = -1; // 1.找出那个切割线 for (int i = start; i < end; i++) { // 遇到比root大的数,表示前一半已找到。 // 则前一半的根原始的i-1 if (array[i] > root) { newRootIndex = i; break; } } // 2.确定切割线以后再看左边和右边是否都满足,最后是用left&&right推断 boolean left = true; boolean right = true; // newRootIndex=-1没找到,进这个if说明是找到了 if (newRootIndex != -1) { // 如今要做的就是验证后半部分是否都满足全部的元素都大于root for (int i = newRootIndex; i < end - 1; i++) { // 假设找到一个。那就肯定是不满足的了,返回false if (array[i] < root) { return false; } } // 假设要找check(array,start,newRootIndex-1),则必须保证end比start要大, // 即newRootIndex-1 - start > 0 if (newRootIndex - 1 - start > 0) { left = check(array, start, newRootIndex - 1); } // 假设要找check(array,newRootIndex,end-1),则必须保证end-1比newRootIndex要大 // 即end-1 - newRootIndex > 0 if (end - 1 - newRootIndex > 0) { right = check(array, newRootIndex, end - 1); } } else { // 遇到没有找到的起概况。那就说明全部的数都比root小。那全在root的左节点下。 // 所以left=check(array,start,end-1) left = check(array, start, end - 1); } return left && right; } }